【发布时间】:2018-08-12 01:11:05
【问题描述】:
我有一个关于 Scala 列表中的 ++ 运算符和类型符号 [B >: A] 的基本问题。
最常见的解释是“接受任何作为 A 的超类的 B”
但是我可以执行以下代码并使用class B(Sprite)调用++,它不是class A(可乐)的超类。
我知道 scala 在这种情况下可能会推断出最近的共同祖先,并在调用++ 时创建SoftDrink 对象列表,如下所示。
我的问题是,API 文档中的哪个位置声明可以将与 A 具有共同祖先的 B 传递给 ++ 运算符? [B >: A] 在合同要求中似乎很简单,即 B 是 A 的超类,而不是关于共同祖先的任何东西。
abstract class Drink
abstract class SoftDrink() extends Drink
abstract class Juice() extends Drink
case class Cola() extends SoftDrink
case class Sprite() extends SoftDrink
scala> val al = List(Cola(), Cola())
al: List[Cola] = List(Cola(), Cola())
scala> val bl = List(Sprite())
bl: List[Sprite] = List(Sprite())
scala> val cl = al ++ bl
cl: List[SoftDrink with Product with Serializable] = List(Cola(),
Cola(), Sprite())
【问题讨论】:
标签: scala covariance scala-collections contravariance