【问题标题】:Indirect recursive generic type definitions in scalascala中的间接递归泛型类型定义
【发布时间】:2012-06-03 15:50:59
【问题描述】:

直接类型递归有效:

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]]]
              ^

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

【问题讨论】:

    标签: scala generics recursion


    【解决方案1】:

    这里的问题不在于递归——它实际上是类型参数不符合边界的问题,如错误消息所述。如果您使参数协变,您的示例将完美运行:

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

    在您的版本中(没有协方差),VVV[UU[V]] 的子类型这一事实无法告诉我们UU[V] 是否是UU[VV[UU[V]]] 的子类型,因此我们得到一致性错误。如果类型参数是协变的,我们就知道VVV[UU[V]] 的子类型意味着UU[V]UU[VV[UU[V]]] 的子类型,一切都很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 2012-11-18
      相关资源
      最近更新 更多