在Scala编程第二版第19.5节中
class Queue[+T] (private val leading: List[T],
private val trailing: List[T] ) {
def enqueue[U >: T](x: U) =
new Queue[U](leading, x :: trailing) // ...
}
T
应该在
def enqueue[U- >: T-](x: U-) =
new Queue[U](leading, x :: trailing) // ...
但是书上提到有2次抛硬币
从技术上讲,发生的是下界翻转。类型参数U为负值(1次翻转),而下界(>:T)为正值(2次翻转)。
这里怎么出现2次抛硬币?
在enqueue
中,T
不是类型参数,而是对外部上下文的类型成员的引用。因此,说"T
应该以负的位置结束"是不正确的。
也许你可以把对T
的引用看作是U
的下界,作为"产生T
的方法调用",只是它是一个"类型调用",所以T
有点像"返回类型"或协变位置。
下面这句话很重要:
直观地说,如果
T
是比预期更具体的类型(例如,Apple
而不是Fruit
),调用append仍然有效,因为U
(Fruit
)仍然是T
(Apple
)的超类型。