Scala List 中 ++ 运算符的类型要求 [B >: A]



我有一个关于 Scala 列表中的 ++ 运算符和类型表示法 [B>: A] 的基本问题。

最常见的解释是"接受任何 B 是 A 的超类">

但是我可以做一些类似于下面的代码的事情,并使用不是class A超类(Cola(的class B(Sprite(调用++

我知道在这种情况下,scala 可能会推断出最接近的共同祖先,并在调用++时创建一个SoftDrink对象列表,如下所示。

我的问题是,在 API 文档中的哪个地方说明可以将具有A共同祖先的B传递给++运算符? [B >: A]合同要求中似乎很简单,即BA的超阶级,而不是关于共同祖先的任何东西。

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?

它不需要,因为这超出了类型下限的定义。最接近的超SpriteCola类型是SoftDrink,因此满足编译器的要求。

你是对的,编译器帮助搜索两种类型的共同祖先可能不会立即直观,但它仍然属于定义的标准。

Scala 规范中指出这一点的相关部分是一致性

Scala docs, List ++

def ++[B](that: GenTraversableOnce[B]): List[B]

返回一个新列表,其中包含左侧操作数中的元素,后跟 右侧操作数中的元素。列表的元素类型 是最具体的超类,包含 两个操作数。

相关内容

  • 没有找到相关文章

最新更新