为什么Scala中的类型参数列表中的所有不变泛型类位置都不变?
我对下面的类型检查器的严格性感到有点困惑 – 似乎Inv [T]的不变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) 需要上面提到的检查是如此严格? 解决方法
从语言
specification(强调我的),关于一致性(即T’是T的超类型):
这真的很难理解(恕我直言),但我相信这意味着Variantish在T中是协变的,你必须能够写 Variantish[Dog,TVar] <: Variantish[Animal,TVar] 对于Variantish [动物,TVar]有意义的任何TVar.但对于一些TVar来说,这甚至没有意义(更不用说有任何真值),例如Inv [Animal].这就是为什么它被禁止在那个地方. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |