我对下面的类型检查器的严格性感到有些困惑-看来TInv[T]不变Variantish位置在ojit_code的参数列表中也不变:

scala> class Inv[T]
defined class Inv

scala> class Variantish[+T, +TVar <: Inv[T]]
<console>:12: error: covariant type T occurs in invariant position in type  <: Inv[T] of type TVar
       class Variantish[+T, +TVar <: Inv[T]]
                             ^

变体类型通常可以合法地出现在不变的参数列表位置,例如具有受对象保护的可见性:
class Variantish[+T](protected[this] var v: Inv[T])

并且似乎以下内容与类型安全一样:
class Variantish[+T, +TVar <: Inv[T]](protected[this] var v: TVar)

需要上面提到的检查如此严格吗?

最佳答案

从语言specification(重点是我的)开始,关于一致性(即T'T的父类(super class)型):



这确实很难理解(IMHO),但是我相信这意味着VariantishT中是协变的,您将必须能够编写

Variantish[Dog, TVar] <: Variantish[Animal, TVar]

对于,对于TVar有意义的任何 Variantish[Animal, TVar]。但这对于某些TVar(例如Inv[Animal])甚至没有意义(更不用说具有任何真值了)。这就是为什么在那个地方禁止使用它的原因。

10-06 11:24