直接类型递归就可以了:

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

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

关于scala - Scala中的间接递归泛型类型定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10871731/

10-12 21:52