5

重複の可能性:
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 }
                                 ^

では、オブジェクトの自己アノテーションは何を意味するのでしょうか?

4

1 に答える 1

3

実際、クラスでも同じことができます。継承されない自己型を追加しますが、そのようなクラスをインスタンス化することはできません。

シングルトンオブジェクトにセルフタイプを許可しても、プログラムが無効になることはありません。シングルトンオブジェクト内からセルフタイプのメソッドを呼び出す(またはその内部クラスをインスタンス化する)ことはできません。 t自己型を継承します。

それにもかかわらず、それはバグである可能性があり、バグを報告することをお勧めします

于 2012-06-28T11:16:21.617 に答える