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
的超类型。
编译器有问题吗?还是我误解了这个概念?
答案 0 :(得分:1)
new Cat
不必是Cat类型。new Cat
不仅可以是Cat
类型。可以是Cat
,Animal
,AnyRef
或Any
类型。
因此,这里 K
被推断为最小的可能类型,即Animal
。
答案 1 :(得分:1)
t.get
的参数必须为t.K
类型。编译器不知道确切是什么类型,但确实知道它是Animal
的超类型,因此是Cat
的超类型。因此,Cat
类型的任何值也具有t.K
类型。