web-dev-qa-db-ja.com

Java 8つの仮想拡張メソッドを持つインターフェースはMixinと同じものですか?

この投稿 は、Java 8と呼ばれる仮想拡張メソッド(以前はデフォルトメソッドまたはディフェンダーメソッドと呼ばれていました)の新機能を説明しています。提供されている例では、インターフェイスには1つのメソッドがあります。 、クラスによって実装されます。次に2番目のメソッドが追加されますが、クラスにインターフェースの新しいメソッドをすぐに実装するように強制する代わりに、「仮想拡張メソッド」がこの新しいメソッドの実装としてインターフェース内に作成されます。クラスは新しいメソッドをすぐに実装する必要はありません。

しかし、プログラマーがインターフェースで仮想拡張メソッドを作成することを決定し、サブクラスが独自のバージョンを実装することを決して計画しないと言います。それはミックスインではないでしょうか?それは私には1つのように見えますが、そのように呼ばれることは聞いたことがありません。私が理解していない根本的な違いはありますか?

7
Thunderforge

はい、これらはミックスインです。 Scala traits(親の「self」オブジェクトとそのプロパティまたはメソッドへの参照を持つ能力はありません))ほど強力ではありませんが、デフォルトのメソッドは意味のある動作を実装できるため、インターフェースが拡張されたときに、既存のコードの破壊を止めるために石膏を貼り付ける以上のことをします。

機能のさまざまな情報に基づく discussions から判断すると、デフォルトのメソッドの制限された能力は意図的なもののようです。設計者のアドバイスは、デフォルトのメソッドは通常、メソッドの具体的な実装を含むべきではなく、ラムダまたは具体的なクラスへの参照を受け入れるべきであり、どちらも実装を提供できるということです。例 ここ

6
itsbruce

これはミックスインに似ていますが、インターフェースにデータを含めることができないため、それほど強力ではありません。

2
kevin cline