Java 8では、デフォルトの方法既存の実装を変更することなくインターフェースを拡張する機能を提供します。
メソッドがオーバーライドされている場合、または異なるインターフェースで競合するデフォルト実装のために使用できない場合に、メソッドのデフォルト実装を明示的に呼び出すことは可能でしょうか。
interface A {
default void foo() {
System.out.println("A.foo");
}
}
class B implements A {
@Override
public void foo() {
System.out.println("B.foo");
}
public void afoo() {
// how to invoke A.foo() here?
}
}
上記のコードを考慮すると、A.foo()
クラス B のメソッドからどのように呼び出すでしょうか?
ベストアンサー1
に従ってこの記事インターフェースのデフォルトメソッドにアクセスするにA
は
A.super.foo();
これは次のように使用できます(インターフェースA
とC
両方にデフォルトメソッドがあると仮定foo()
)
public class ChildClass implements A, C {
@Override
public void foo() {
//you could completely override the default implementations
doSomethingElse();
//or manage conflicts between the same method foo() in both A and C
A.super.foo();
}
public void bah() {
A.super.foo(); //original foo() from A accessed
C.super.foo(); //original foo() from C accessed
}
}
A
とC
の両方に.foo()
メソッドがあり、特定のデフォルト実装を選択することも、新しいfoo()
メソッドの一部として 1 つ (または両方) を使用することもできます。同じ構文を使用して、実装クラスの他のメソッドのデフォルト バージョンにアクセスすることもできます。
メソッド呼び出し構文の正式な説明は、JLS第15章。