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

ayv*_*ngo 8 generics recursion scala

直接类型递归正常工作:

trait TT[T<:TT[T]]
Run Code Online (Sandbox Code Playgroud)

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

trait UU[V <: VV[UU[V]]]
trait VV[U <: UU[VV[U]]]
Run Code Online (Sandbox Code Playgroud)

给我错误:

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]]]
              ^
Run Code Online (Sandbox Code Playgroud)

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

Tra*_*own 11

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

trait UU[+V <: VV[UU[V]]]
trait VV[+U <: UU[VV[U]]]
Run Code Online (Sandbox Code Playgroud)

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