在Scala第2版的编程中,在以下示例的第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) // ...
但是这本书提到有两个翻转
从技术上讲,会发生的是下限发生翻转。类型参数U处于负位置(1翻转),而下限(>:T)处于正位置(2翻转)。
这里有两次翻转吗?
答案 0 :(得分:1)
在enqueue
中,T
不是类型参数,而是对外部上下文的类型成员的引用。因此它是不正确地说“T
应该最终处于负面位置”。
也许您可以将T
的引用视为U
的下限作为“产生T
的方法调用”,只是它是“类型调用”,所以{ {1}}处于“返回类型”或协变位置。
以下句子很重要:
直观地说,如果
T
是比预期更具体的类型(例如,T
而不是Apple
),则追加调用仍然有效,因为Fruit
(U
)仍然是Fruit
(T
)的超类型。