問題
次のコードの MyClass について正しい説明はどれですか。
public interface MyTypeA {
default void myMethod() {
System.out.println("MySubInterface::myMethod is called.");
}
}
interface MyTypeB {
default void myMethod() {
System.out.println("MyInterface::myMethod is called.");
}
}
class MyClass implements MyTypeA, MyTypeB {
//
}
選択肢
A)MyClass では追加のメソッド実装は必要ない。myMethod( ) を使用する場合インターフェース型で参照する必要がある
B)MyClass では myMethod( )を実装する必要がある。インターフェース MyTypeA または MyTypeB のメソッド実装にアクセスする場合は `MyTypeB.default.myMethod( )
` のように記述する
C)MyClass では myMethod( )を実装する必要がある。インターフェース MyTypeA または MyTypeB のメソッド実装にアクセスする場合は `MyTypeA.super.myMethod( )
` のように記述する
D)MyClass では myMethod( )を実装する必要がある。各インターフェースのメソッド実装にはアクセスできないため、独自の実装を行う必要がある
E)MyClass では追加のメソッド実装は必要ない。myMethod( ) が呼び出されるとインターフェース MyTypeB の実装が使用される
F)MyClass では追加のメソッド実装は必要ない。myMethod( ) が呼び出されるとインターフェース MyTypeA の実装が使用される
解答
A)MyClass では追加のメソッド実装は必要ない。myMethod( ) を使用する場合インターフェース型で参照する必要がある
B)MyClass では myMethod( )を実装する必要がある。インターフェース MyTypeA または MyTypeB のメソッド実装にアクセスする場合は `MyTypeB.default.myMethod( )
` のように記述する
C)MyClass では myMethod( )を実装する必要がある。インターフェース MyTypeA または MyTypeB のメソッド実装にアクセスする場合は `MyTypeA.super.myMethod( )
` のように記述する
D)MyClass では myMethod( )を実装する必要がある。各インターフェースのメソッド実装にはアクセスできないため、独自の実装を行う必要がある
E)MyClass では追加のメソッド実装は必要ない。myMethod( ) が呼び出されるとインターフェース MyTypeB の実装が使用される
F)MyClass では追加のメソッド実装は必要ない。myMethod( ) が呼び出されるとインターフェース MyTypeA の実装が使用される
解説:
MyClass
はMyTypeA
とMyTypeB
の両方のインターフェースを実装していますが、両方のインターフェースにmyMethod()
のデフォルト実装があります。この場合、コンパイラはどのmyMethod()
を呼び出すべきかを特定できないため、MyClass
ではmyMethod()
を自分で実装する必要があります。MyTypeA
とMyTypeB
のメソッドにアクセスするには、MyTypeA.super.myMethod()
またはMyTypeB.super.myMethod()
のように、どのインターフェースのメソッドを呼び出すのかを明示的に指定する必要があります。
他の選択肢の理由:
- A):
myMethod()
を実装する必要があるので、誤り。 - B):
MyTypeB.default.myMethod()
という記述は正しくない。呼び出し方が間違っている。 - D): 各インターフェースのメソッド実装にアクセスできるため、独自の実装を行う必要はない。
- E): どちらの実装が使用されるかは実装次第で、明示的に指定しない限り、どちらかは決まらない。
- F): 同様に、どちらの実装が使用されるかは不確定。
したがって、正解は C) です。
対象資格:Java SE17 認定資格