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

问题描述 投票:1回答:2

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

最常见的是将其解释为“接受任何一个超A类的B”

但后来我可以做类似下面的代码并使用++(Sprite)调用class B,这不是class A(Cola)的超类。

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

我的问题是,它在API文档中的哪个位置表明可以将B传递给A运算符,该++[B >: A]有共同的祖先? B似乎在合同要求中非常简单,Aabstract 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()) 的超类,而不是关于共同祖先的任何东西。

Sprite
scala covariance scala-collections contravariance
2个回答
3
投票

在API文档中,它表明可以传递一个具有A to ++运算符的共同祖先的B?

它不需要,因为它不属于较低类型边界的定义。最接近的超级类型的ColaSoftDrinkConformance,因此满足编译器的要求。

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

指出这一点的Scala规范的相关部分是def ++[B](that: GenTraversableOnce[B]): List[B]


1
投票

Scala docs,List ++

qazxswpoi

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

© www.soinside.com 2019 - 2024. All rights reserved.