类型成员细化中的类型范围

时间:2018-10-12 12:47:16

标签: scala types

class Animal
class Cat extends Animal

trait ZPar {
  type K
  def get(i: K)
}

def zz(t:ZPar{ type K >: Animal } ) = {
   t.get(new Cat) //compiled! why?
}

此代码编译没有错误,但是我认为一定存在问题,因为K >: Animal并且我正在传递Cat,它绝对不是Animal的超类型。

编译器有问题吗?还是我误解了这个概念?

2 个答案:

答案 0 :(得分:1)

new Cat不必是Cat类型。 new Cat不仅可以是Cat类型。可以是CatAnimalAnyRefAny类型。

因此,这里K被推断为最小的可能类型,即Animal

答案 1 :(得分:1)

t.get的参数必须为t.K类型。编译器不知道确切是什么类型,但确实知道它是Animal的超类型,因此是Cat的超类型。因此,Cat类型的任何值也具有t.K类型。