[B >: A] "Lower Type Bounds" 在 scala 中是什么意思?为什么 child class obj 也可以传入?

what is [B >: A] "Lower Type Bounds"'s mean in scala? why child class obj can passed in too?

::方法中有个"Lower Type Bounds":

def ::[B >: A] (x: B): List[B] =
new scala.collection.immutable.::(x, this)

[B>:A]meanB是A的Parentclass,但是为什么ChildClass的对象可以传入:: 方法?

class GP
class P extends GP
class C extends P

val li : List[P] = List[P](new P)
(new GP)::li // ok
(new C)::li  // why here ok? 

这个(ndw C)::li // why here ok?,(new C)是ChildClass的obj不是P的Superclass,这不符合[B>:A])?

如您所说,C 不是(或等于)P 的父级,因此不能选择 C 作为 B 的值.但是,C 类型的值可以传递给需要 P 类型值的方法(因为 C 是子 class),所以如果我们选择 B=P, 我们得到 ::(x: P): List[P] 并且 new C 可以作为 x 的值传入。当您执行 (new C) :: li.

时就会发生这种情况

这就是为什么结果类型是 List[P] 而不是 List[C](这是错误的),而前一行的类型是 List[GP],因为那一行 [=必须选择 25=] 才能计算出类型。

这不是错误,因为 (new C)C 的一个实例,因此也是 P 的一个实例;所以,在那个例子中,BA type-variables 都是 P.

(您的下一个问题可能是——如果下限类型允许这样做,那么它有什么用?答案是它允许这样做:

val liC : List[C] = List[C](new C)
val liP : List[P] = (new P)::liC

(实际上 "promoting" 一个 List[C] 到一个 List[P])不允许这样:

val liP : List[P] = List[P](new P)
val liC : List[C] = (new C)::liP    // invalid! cannot downcast!

.)