加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么Scala中的类型参数列表中的所有不变泛型类位置都不变?

发布时间:2020-12-16 18:32:00 所属栏目:安全 来源:网络整理
导读:我对下面的类型检查器的严格性感到有点困惑 – 似乎Inv [T]的不变T位置在Variantish的参数列表中也是不变的: scala class Inv[T]defined class Invscala class Variantish[+T,+TVar : Inv[T]]console:12: error: covariant type T occurs in invariant posi
我对下面的类型检查器的严格性感到有点困惑 – 似乎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的超类型):

Type constructors T and T′ follow a similar discipline. We characterize T and T′ by their type parameter clauses [a1,…,an] and [a′1,a′n],where an ai or a′i may include a variance annotation,a higher-order type parameter clause,and bounds. Then,T conforms to T′ if any list [t1,tn] — with declared variances,bounds and higher-order type parameter clauses — of valid type arguments for T′ is also a valid list of type arguments for T and T[t1,tn]<:T′[t1,tn].

这真的很难理解(恕我直言),但我相信这意味着Variantish在T中是协变的,你必须能够写

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

对于Variantish [动物,TVar]有意义的任何TVar.但对于一些TVar来说,这甚至没有意义(更不用说有任何真值),例如Inv [Animal].这就是为什么它被禁止在那个地方.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读