1

:: 方法中有一个“Lower Type Bounds”:

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

[B >: A]意思是B是A的Parent class,但是为什么Child Class的对象可以在::方法中传入呢?

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? 

this (ndw C)::li // why here ok?, (new C) 是 Child Class 的 obj 而不是 P 的 Super class,这不符合 [B >: A]) 吗?

4

2 回答 2

1

正如您所说,C不是(或等于)的父级P,因此C不能选择作为B. 然而 type 的值C可以传递给期望 type 值的方法P(因为C是一个子类),所以如果我们选择B=P,我们得到::(x: P): List[P]并且new C可以作为 的值传入x。这就是你这样做时会发生的事情(new C) :: li

这就是为什么结果类型是List[P]而不是List[C](这将是错误的),而前一行的类型是该行List[GP]B=GP类型,必须选择该类型才能解决。

于 2016-01-01T17:02:29.297 回答
1

这不是错误,因为(new C)它是 的实例C,因此是P; 因此,在该示例中, theBA类型变量都是P.

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

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

(有效地“提升” aList[C]到 a List[P])而不允许这样做:

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

.)

于 2016-01-01T17:02:53.820 回答