1. ホーム

[解決済み】Javaでデフォルトのメソッドを明示的に呼び出す

2022-03-28 21:47:36

質問

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のメソッドから呼び出すことはできますか?

どのように解決するのですか?

の通りです。 この記事 インターフェイスのデフォルトメソッドにアクセスする場合 A を使って

A.super.foo();

これは次のように使うことができます(インターフェイスを想定しています AC はどちらもデフォルトのメソッド 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
    }
}

AC は、どちらも .foo() メソッドを実装し、特定のデフォルトの実装を選択することもできますし、どちらか (あるいは両方) を新しい foo() メソッドを使用します。また、同じ構文を使用して、実装クラスの他のメソッドでデフォルトバージョンにアクセスすることもできます。

メソッド呼び出しの構文についての正式な説明は JLSの第15章 .