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]]]VVV[UU[V]]UU[V]UU[VV[UU[V]]]

于 2012-06-03T18:49:14.610 に答える