DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

7章7

このJavaコードは、二つのインターフェース AB があり、両方に test という同じシグネチャを持つデフォルトメソッドがあります。クラス Main はこれら両方のインターフェースを実装しており、メインメソッドから test メソッドを呼び出しています。

Javaにおいて、同一のシグネチャを持つメソッドが二つのインターフェースに存在し、両方を実装するクラスがそのメソッドをオーバーライドしない場合、コンパイルエラーが発生します。これは、どちらのインターフェースのメソッドを使用すべきかが不明確であるためです。

したがって、このコードを実行しようとすると、オプションCのように「コンパイルエラーが発生する」というのが正解です。答えがCである理由は、Javaのコンパイラは Main クラスが test メソッドを実行しようとした際に、AB のどちらの test メソッドを呼び出すべきかを決定できないためです。

ここでコメントアウトを加えると以下のようになります:

public interface A {
    // Aインターフェースにデフォルト実装を持つtestメソッドがある。
    default void test() {
        System.out.println("A");
    }
}

public interface B {
    // Bインターフェースにもデフォルト実装を持つtestメソッドがある。
    default void test() {
        System.out.println("B");
    }
}

public class Main implements A, B {
    // MainクラスはAとBの両方を実装するが、testメソッドをオーバーライドしていない。
    public static void main(String[] args) {
        // Mainのインスタンスを作成し、testメソッドを呼び出す。
        // しかし、AのtestかBのtestのどちらを呼び出すかが不明なため、コンパイルエラーが発生する。
        new Main().test();
    }
}
Enter fullscreen mode Exit fullscreen mode

この状態でコードをコンパイルすると、エラーメッセージが表示され、どのメソッドを使用するかを明示的に指定する必要があることを示します。修正するには、Main クラスで test メソッドをオーバーライドし、A.super.test() または B.super.test() を使用してどちらのインターフェースのメソッドを呼び出すかを明示的に指定する必要があります。

追記

コンパイルエラーを回避するためには、Main クラスが test メソッドをオーバーライドして、AB のどちらの test メソッドを使用するかを明示的に決定する必要があります。以下はその方法の一つです:

public class Main implements A, B {
    // オーバーライドすることで、どちらのインターフェースのメソッドを呼び出すかを指定する。
    @Override
    public void test() {
        A.super.test(); // Aのtestメソッドを呼び出す
        // Bのtestメソッドを使用したい場合は、上記の行をB.super.test();に変更する。
    }

    public static void main(String[] args) {
        new Main().test();
    }
}
Enter fullscreen mode Exit fullscreen mode

このコードでは Main クラスが test メソッドをオーバーライドしており、Atest メソッドを明示的に呼び出しています。Btest メソッドを呼び出したい場合は、A.super.test(); の行を B.super.test(); に置き換えます。このようにオーバーライドすることで、どのメソッドが呼び出されるかをコンパイラに指示することができ、コンパイルエラーを回避できます。

Top comments (0)