我有一个关于 Scala 列表中的 ++ 运算符和类型表示法 [B>: A] 的基本问题。
最常见的解释是"接受任何 B 是 A 的超类">
但是我可以做一些类似于下面的代码的事情,并使用不是class A
超类(Cola(的class B
(Sprite(调用++
。
我知道在这种情况下,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())
在 API 文档中的哪个地方,它指出可以传递与 A 到 ++ 运算符具有共同祖先的 B?
它不需要,因为这超出了类型下限的定义。最接近的超Sprite
和Cola
类型是SoftDrink
,因此满足编译器的要求。
你是对的,编译器帮助搜索两种类型的共同祖先可能不会立即直观,但它仍然属于定义的标准。
Scala 规范中指出这一点的相关部分是一致性
Scala docs, List ++
def ++[B](that: GenTraversableOnce[B]): List[B]
返回一个新列表,其中包含左侧操作数中的元素,后跟 右侧操作数中的元素。列表的元素类型 是最具体的超类,包含 两个操作数。