このScalaコードが型チェックに失敗するのはなぜですか?これらの型引数が型の細分化に適合しないのはなぜですか?
trait T { type A }
trait GenFoo[A0, S <: T { type A = A0 }]
trait Foo[S <: T] extends GenFoo[S#A, S]
"型引数[S#A、S]はGenFooの型パラメータの境界を形質に適合していない[A0、S <:T {タイプA = A0を}]" なぜ私は理解していません。回避策はありますか?
編集:指摘したように、適合エラーは、S <: T{type A = S#A}
の検証失敗に起因します。ダニエルソブラルは私たちに伝えている、-explaintypes
指さ:
S <: T{type A = S#A}?
S <: T?
true
S specializes type A?
this.A = this.A?
S = this.type?
false
false
false
false
私はこれを解釈するかどうかはわかりません。我々が定義しようとした場合、我々は違法循環参照を取得
注意、
trait Foo[S <: T { type A = S#A } ] extends GenFoo[S#A, S]
ここで型改良は、新しい情報を追加していないようですが。 (またWhy is this cyclic reference with a type projection illegal?参照)
私のモチベーションはのように、S#A
に特化した特性Foo[S <: T]
作成することです。この作業を取得するにはHow to specialize on a type projection in Scala?を、私は、実装トレイトGenFoo
に明示的なパラメータA0
としてS#A
表面化しようとしていますそれは直接専門化することができます。私はMiles Sabinの答えから型式改良アイデアをWhy is this cyclic reference with a type projection illegal?に適用したいと考えていましたが、私はこの適合エラーに遭遇します。
-explaintypesを試しましたか? –
ポインタをありがとう。 -explaintypesからの出力を含めるように質問を更新しました。 –