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();
}
}