直接类型递归正常工作:
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]]]
^
如何正确表达间接类型参数递归?
答案 0 :(得分:11)
这里的问题不是递归 - 它实际上是一个不符合边界的类型参数的问题,正如错误信息所说的那样。如果您使参数协变,您的示例将完美运行:
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]]]
的子类型,一切都很好。