1

我写了以下代码:

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]

4

1 回答 1

4

的无点中缀表示法

new Bird :: animalList

脱糖

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)
于 2016-04-13T07:21:40.483 回答