如何在 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)
我写了下面的代码:
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)