[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
的一个实例;所以,在那个例子中,B
和 A
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!
.)
::方法中有个"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
的一个实例;所以,在那个例子中,B
和 A
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!
.)