DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

7章5

書籍の指摘を含め、コードにコメントを加えた形で説明します。

// 'A' インターフェースの定義。
public interface A {
    // '@Override' アノテーションは、既に存在するメソッドをオーバーライドする際に使用されます。
    // 'toString()' は Java の 'Object' クラスで定義されているメソッドです。
    // インターフェースのデフォルトメソッドとして 'toString()' を提供しても構いませんが、
    // それをオーバーライドとは見なされないため '@Override' アノテーションは不適切です。
    // このアノテーションをここに使うとコンパイルエラーが発生します。
    @Override 
    default String toString() {
        return "A";
    }
}

// 'B' クラスの定義。'A' インターフェースを実装します。
public class B implements A {
    // 'A' の 'toString()' メソッドをオーバーライドしています。
    // この '@Override' アノテーションは正しく、オーバーライドしていることを示します。
    @Override
    public String toString() {
        return "B";
    }
}

// メインクラス 'Main' の定義。
public class Main {
    public static void main(String[] args) {
        // 'A' の参照変数 'a' に 'B' クラスのインスタンスを割り当てます。
        A a = new B();
        // 'a.toString()' を呼び出すと、実際には 'B' クラスの 'toString()' が呼び出され、
        // "B" という文字列が出力されます。
        System.out.println(a);
    }
}
Enter fullscreen mode Exit fullscreen mode

インターフェースでObjectクラスのtoString()メソッドをデフォルトメソッドとして定義すること自体は、言語仕様としては許されています。しかし、@Overrideアノテーションは既存のメソッドをオーバーライドするときにのみ使用するため、インターフェース内でObjectのメソッドをデフォルト実装する際には不要です。そのため、このアノテーションを使用すると、コンパイルエラーが発生するのです。

この設問における正しい答えは、インターフェースAで@Overrideアノテーションを不適切に使用しているため、コンパイルエラーが発生するということです。ですので、「Aインターフェースでコンパイルエラーとなる」というのが、設問の答えとなります。

コンパイルエラーを避けるには、@Overrideを削除します。

Top comments (0)