書籍の指摘を含め、コードにコメントを加えた形で説明します。
// '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);
}
}
インターフェースでObjectクラスのtoString()メソッドをデフォルトメソッドとして定義すること自体は、言語仕様としては許されています。しかし、@Overrideアノテーションは既存のメソッドをオーバーライドするときにのみ使用するため、インターフェース内でObjectのメソッドをデフォルト実装する際には不要です。そのため、このアノテーションを使用すると、コンパイルエラーが発生するのです。
この設問における正しい答えは、インターフェースAで@Overrideアノテーションを不適切に使用しているため、コンパイルエラーが発生するということです。ですので、「Aインターフェースでコンパイルエラーとなる」というのが、設問の答えとなります。
コンパイルエラーを避けるには、@Overrideを削除します。
Top comments (0)