这个问题在这里已有答案:
:: method中有一个“Lower Type Bounds”:
def ::[B >: A] (x: B): List[B] =
new scala.collection.immutable.::(x, this)
[B>:A] mean B是A的Parent类,但为什么Child Class的对象可以在:: method中传递?
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?
,(新C)是Child Class的obj而不是P的超级类,这是不是按照[B>:A])?
2 回答
如你所说,
C
不是_或等于P
的父级,因此C
不能被选为B
的值 . 但是,类型C
的值可以传递给期望值为P
的值的方法(因为C
是子类),所以如果我们选择B=P
,我们可以将::(x: P): List[P]
和new C
作为x
的值传入 . 当你做(new C) :: li
时会发生这种情况 .这就是为什么结果类型是
List[P]
而不是List[C]
(这将是错误的),而前一行的类型是List[GP]
,因为在那一行B=GP
必须选择类型来解决 .这不是错误,因为
(new C)
是C
的实例,因此P
;所以,在那个例子中,B
和A
类型变量都是P
.(你的下一个问题可能是 - 如果较低的类型绑定允许这个,那么它的用途是什么?答案是它允许这样:
(实际上"promoting" a
List[C]
到List[P]
)不允许这样做:. )