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

scala中的间接递归泛型类型定义

发布时间:2020-12-16 08:59:23 所属栏目:安全 来源:网络整理
导读:直接类型递归正常工作: trait TT[T:TT[T]] 但我可以用天真的方法做出间接的 trait UU[V : VV[UU[V]]]trait VV[U : UU[VV[U]]] 给我错误: CyclicTraits.scala:23: error: type arguments [UU[V]] do not conform to trait VV's type parameter bounds [U :
直接类型递归正常工作:

trait TT[T<:TT[T]]

但我可以用天真的方法做出间接的

trait UU[V <: VV[UU[V]]]
trait VV[U <: UU[VV[U]]]

给我错误:

CyclicTraits.scala:23: error: type arguments [UU[V]] do not conform to
    trait VV's type parameter bounds [U <: UU[VV[U]]]
trait UU[V <: VV[UU[V]]]
              ^
CyclicTraits.scala:25: error: type arguments [VV[U]] do not conform to
    trait UU's type parameter bounds [V <: VV[UU[V]]]
trait VV[U <: UU[VV[U]]]
              ^

如何正确表达间接类型参数递归?

解决方法

这里的问题不是递归 – 它实际上是一个不符合边界的类型参数的问题,正如错误信息所说的那样.如果您使参数协变,您的示例将完美运行:

trait UU[+V <: VV[UU[V]]]
trait VV[+U <: UU[VV[U]]]

在您的版本中(没有协方差),V是VV [UU [V]]的子类型的事实告诉我们UU [V]是否是UU [VV [UU [V]]]的子类型,所以我们得到了一致性错误.如果类型参数是协变的,我们知道V是VV [UU [V]]的子类型需要UU [V]是UU [VV [UU [V]]]的子类型,一切都很好.

(编辑:李大同)

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

    推荐文章
      热点阅读