8

直接类型递归有效:

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

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

4

1 回答 1

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]]],一切都很好。

于 2012-06-03T18:49:14.610 回答