下界的

时间:2016-08-22 14:05:14

标签: scala covariance

在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翻转)。

这里有两次翻转吗?

1 个答案:

答案 0 :(得分:1)

enqueue中,T 不是类型参数,而是对外部上下文的类型成员的引用。因此它是不正确地说“T应该最终处于负面位置”。

也许您可以将T的引用视为U的下限作为“产生T的方法调用”,只是它是“类型调用”,所以{ {1}}处于“返回类型”或协变位置。

以下句子很重要:

  

直观地说,如果T是比预期更具体的类型(例如,T而不是Apple),则追加调用仍然有效,因为FruitU)仍然是FruitT)的超类型。