我有一个关于Scala列表中++运算符的基本问题,以及类型符号[B>:A]。
最常见的是将其解释为“接受任何一个超A类的B”
但后来我可以做类似下面的代码并使用++
(Sprite)调用class B
,这不是class A
(Cola)的超类。
我理解,然后scala可能会在这种情况下推断出最接近的共同祖先,并在调用SoftDrink
时创建一个++
对象列表,如下所示。
我的问题是,它在API文档中的哪个位置表明可以将B
传递给A
运算符,该++
与[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())
的超类,而不是关于共同祖先的任何东西。
Sprite
在API文档中,它表明可以传递一个具有A to ++运算符的共同祖先的B?
它不需要,因为它不属于较低类型边界的定义。最接近的超级类型的Cola
和SoftDrink
是Conformance,因此满足编译器的要求。
你是对的,编译器帮助搜索这两种类型的共同祖先可能不是直观的,但它仍然属于定义的标准。
指出这一点的Scala规范的相关部分是def ++[B](that: GenTraversableOnce[B]): List[B]
Scala docs,List ++
qazxswpoi
返回一个新列表,其中包含左侧操作数中的元素,后跟右侧操作数中的元素。列表的元素类型是包含两个操作数的元素类型的最特定的超类。