如何在 scala 中解释 ::

How to interpret :: in scala

我写了下面的代码:

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)

我预计 return 类型为 List[Bird]。为什么是List[Animal]

的无点中缀表示法
new Bird :: animalList

脱糖为

animalList.::(new Bird)

因为以:结尾的方法名称是在表达式右侧的对象上调用的。

如果我们明确指定 Bird 作为类型参数...

animalList.::[Bird](new Bird)

...然后编译器会告诉我们为什么这不起作用:

error: type arguments [Bird] do not conform to method ::'s type parameter bounds [B >: Animal]

B的类型有两个约束:

    方法签名中的
  • B >: A 意味着 B 必须是列表类型的超类型(A,这里是 Animal)。
  • 值参数 (new Bird) 必须是 B 的实例(因为方法参数是协变的)。

编译器选择满足这两个约束的最具体的类型,即 Animal

animalList.::[Animal](new Bird)