https://dzone.com/articles/interface-default-methods-javaより
Java 8 では、「デフォルト メソッド」または (Defender メソッド) の新機能が導入されています。これにより、開発者は、これらのインターフェイスの既存の実装を壊すことなく、インターフェイスに新しいメソッドを追加できます。具象クラスがそのメソッドの実装を提供できない状況でデフォルトとして使用されるインターフェイス定義の実装を許可する柔軟性を提供します。
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
新しい機能について初めて聞いたときに、デフォルトのメソッドについてよくある質問が 1 つあります。
クラスが 2 つのインターフェイスを実装し、それらの両方のインターフェイスが同じシグネチャを持つデフォルト メソッドを定義する場合はどうなるでしょうか。
この状況を説明する例:
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public interface B {
default void foo(){
System.out.println("Calling B.foo()");
}
}
public class ClassAB implements A, B {
}
このコードは、次の結果でコンパイルに失敗します。
java: class Clazz inherits unrelated defaults for foo() from types A and B
これを修正するには、Clazz で競合するメソッドをオーバーライドして手動で解決する必要があります。
public class Clazz implements A, B {
public void foo(){}
}
しかし、独自のメソッドを実装する代わりに、インタフェース A からメソッド foo() のデフォルトの実装を呼び出したい場合はどうでしょう。
次のように A#foo() を参照することができます。
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}