我对下面的类型检查器的严格性感到有些困惑-看来T
的Inv[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),但是我相信这意味着Variantish
在T
中是协变的,您将必须能够编写
Variantish[Dog, TVar] <: Variantish[Animal, TVar]
对于,对于
TVar
有意义的任何 Variantish[Animal, TVar]
。但这对于某些TVar
(例如Inv[Animal]
)甚至没有意义(更不用说具有任何真值了)。这就是为什么在那个地方禁止使用它的原因。