如何解释::在scala中

时间:2016-04-13 07:09:30

标签: scala covariant

我写下面的代码:

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]

1 个答案:

答案 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)