更新:私は質問をより小さく、より正確な例で言い換えました。
次の定義があると仮定します。
class A
trait TraitForA extends A
class D[T]
trait TraitForD extends D[A]
次に、次のようなオブジェクトを作成できます。
scala> new D[A] with TraitForD
res0: D[A] with TraitForD = $anon$1@145d424
ただし、次のオブジェクトを作成することはできません。
scala> new D[A with TraitForA] with TraitForD
<console>:12: error: illegal inheritance;
anonymous class $anon inherits different type instances of class D:
D[A] and D[A with TraitForA]
new D[A with TraitForA] with TraitForD
^
トレイトに次の代わりにセルフタイプを使用する場合も同じことが起こりextends
ます。
scala> trait TraitForD2 { self: D[A] => }
defined trait TraitForD2
scala> new D[A with TraitForA] with TraitForD2
<console>:12: error: illegal inheritance;
self-type D[A with TraitForA] with TraitForD2 does not conform to TraitForD2's
selftype TraitForD2 with D[A]
new D[A with TraitForA] with TraitForD2
^
上記の作成で(正確に)何が間違っていますか?
私の推測では、それD[A with TraitForA]
はタイプとして見られていませんD[A]
。+T
クラスで共変アノテーションを使用する場合D
、両方の例が機能します。
誰かが例が失敗する理由とそれらが機能している理由を説明できますか+T
?
ボーナス質問:例を使用せずに実行する方法はあり+T
ますか?