我写下面的代码:
class Animal
class Bird extends Animal
val animalList = List(new Animal, new Animal)
new Bird :: animalList
::
方法的实现如下所示:
def ::[B >: A] (x: B): List[B] =
new scala.collection.immutable.::(x, this)
我希望返回类型为List[Bird]
。为什么是List[Animal]
?
答案 0 :(得分:4)
的无点中缀符号
new Bird :: animalList
desugars to
animalList.::(new Bird)
因为在表达式右侧的对象上调用以:
结尾的方法名称。
如果我们明确指定Bird
作为类型参数......
animalList.::[Bird](new Bird)
...然后编译器告诉我们为什么不起作用:
错误:类型参数
[Bird]
不符合方法::
的类型参数边界[B >: Animal]
B
的类型有两个限制:
B >: A
表示B
必须是列表类型的超类型(A
,此处为Animal
)。new Bird
)必须是B
的实例(因为方法参数是协变的)。编译器选择满足这两个约束的最具体类型,即Animal
。
animalList.::[Animal](new Bird)