我对下面的类型检查器的严格性感到有些困惑——似乎 的不变T
位置在的参数列表Inv[T]
中也是不变的:Variantish
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)
上面提到的检查需要这么严格吗?