86

JDK 8 で導入された新機能により、バイナリ互換性を維持しながら既存のインターフェースに追加できます。

構文は次のようになります

public interface SomeInterface() {
  void existingInterface();
  void newInterface() default SomeClass.defaultImplementation;
}

このように、既存のすべての実装でSomeInterface、この新しいバージョンにアップグレードするときに、すべてが突然コンパイル エラーになるわけではありませんnewInterface()

これは素晴らしいことですが、実装していない新しいデフォルト メソッドを両方とも追加した 2 つのインターフェイスを実装するとどうなるでしょうか。例を挙げて説明しましょう。

public interface Attendance {
   boolean present() default DefaultAttendance.present;
}

public interface Timeline {
   boolean present() default DefaultTimeline.present;
}

public class TimeTravelingStudent implements Attendance, Timeline {

}

// which code gets called?
new TimeTravelingStudent().present();

これはまだJDK 8の一部として定義されていますか?

Java の神々がhttp://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.htmlで同様のことについて話しているのを見つけましたが、それはプライベート メーリング リストの一部であり、直接尋ねることはできません。

JDK 8 でデフォルトがどのように使用されるか、およびコレクション インターフェイスを拡張してラムダをサポートする方法の詳細については、 https ://oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf を参照してください。

4

8 に答える 8

67

複製操作の答えは次のとおりです。

多重継承の問題を解決するには、同じメソッド名とシグネチャのデフォルト実装を提供する 2 つのインターフェースを実装するクラスが、メソッドの実装を提供する必要があります。[記事全文]

あなたの質問に対する私の答えは次のとおりです。はい、異なる親から動作を継承できるため、これは多重継承の一種です。欠けているのは、状態、つまり属性を継承することです。

于 2011-10-22T06:42:10.130 に答える
5

要するに、これはコンパイル時エラーであり、実装でメソッドを手動でオーバーライドする必要があります。


デフォルト方式の目的

Java 8 でデフォルト メソッドを導入する主な目的は、既存の実装を壊すことなく、インターフェイスを拡張可能にすることです (非常に多くのサードパーティ Java ライブラリがあります)。

C++ のように、multiple inheritance実際には避けることを意図していますが、それは Java のデフォルト メソッドの目的ではありません。


上書きする方法

2 つのオプション:

  • 独自のロジックでメソッドをオーバーライドします。
  • superメソッドをオーバーライドし、フォーマットを介してインターフェイスのメソッドの 1 つを呼び出します。<interface_name>.super.<method_name>();

チップ:

  • publicインターフェイスからのメソッドはデフォルトで public になっているため、オーバーライドするときにキーワードを追加することを忘れないでください。
于 2016-07-19T05:08:13.080 に答える
4

あなたの質問に対する私の答えは次のとおりです。はい、異なる親から動作を継承できるため、これは多重継承の一種です。欠けているのは、状態、つまり属性を継承することです。

はい。ただし、実装クラスが実装する必要があるゲッターとセッターをインターフェイスに追加できます。それにもかかわらず、実装クラスは属性を継承しません。つまり、AFAICS によると、多重継承スタイルのソリューションではなく、特性スタイルのソリューションに似ています。

于 2012-07-26T08:09:45.800 に答える
3

誰かがまだ答えを探している場合、クラスが同じデフォルト メソッドを持つ 2 つのインターフェイスを実装している場合、クラスは独自の実装を提供することで曖昧さを解決する必要があります。デフォルト メソッドでの継承の仕組みの詳細については、このチュートリアルを参照してください。

于 2014-08-04T06:46:23.060 に答える
-1

私が見る限り、ステートレスなので多重継承ではありません。そのため、仮想拡張メソッドは、オブジェクトまたはクラスの機能を完全にはサポートしていません。

于 2014-01-06T16:15:54.857 に答える