重複の可能性:
scala の自己型と特性サブクラスの違いは何ですか?
自己注釈は、プログラマーが特性が注釈付きの特性とミックスインされることを明示するコンパイラへの約束として理解しています。例えば:
scala> trait X
defined trait X
scala> trait Y { this: X => }
defined trait Y
scala> new Y {}
<console>:10: error: illegal inheritance;
self-type Y does not conform to Y's selftype Y with X
new Y {}
^
scala> new Y with X {}
res1: Y with X = $anon$1@1125a40
前の例では、有効な X を新しいインスタンスに設定しなかったため、3 番目の式は失敗しました。明らかに、最後のものはうまく機能します。ここまでは順調ですね。それでは、オブジェクトに関する別の例を見てみましょう。
scala> object Z { this: X => }
defined module Z
次の行に示されているように、X プロミスで失敗してオブジェクトがインスタンス化されていることを理解しています (将来のプロミスでインスタンスを作成しています!)。
scala> trait X { class X1 }
defined trait X
scala> trait Y { this: X => new X1 }
defined trait Y
scala> object Z { this: X => new X1 }
<console>:8: error: not found: type X1
object Z { this: X => new X1 }
^
では、オブジェクトの自己アノテーションは何を意味するのでしょうか?