問題
次のコードでコンパイルエラーになる箇所は(1)から(9)のどれですか。(3つ選択)
public class Main {
public static void main(String... args) {
Base b = new MyClass();
MyType t = new MyClass();
b.print("one"); //(1)
(MyType)b.print("two"); //(2)
((MyType)b).print("three"); //(3)
t.print("four"); //(4)
(MyType)t.print("five"); //(5)
((MyType)t).print("six"); //(6)
}
}
sealed interface MyType permits MyClass { //(7)
void print(String s);
}
class Base { //(8)
public static final String DELIMITER = ",";
}
final class MyClass extends Base implements MyType { //(9)
public void print(String s) {
System.out.print(s + Base.DELIMITER);
}
}
選択肢
A)(1)
B)(2)
C)(3)
D)(4)
E)(5)
F)(6)
G)(7)
H)(8)
I)(9)
解答
A)(1)
B)(2)
C)(3)
D)(4)
E)(5)
F)(6)
G)(7)
H)(8)
I)(9)
解説
A)(1)
→ エラーになりません。b
は Base
型の変数で、実際には MyClass
のインスタンスが代入されています。b.print("one")
は MyClass
のメソッド print
が呼び出されますが、これは問題ありません。
B)(2)
→ エラーになります。(MyType)b.print("two")
という式は、b.print("two")
が MyClass
の print
メソッドを呼び出しますが、戻り値が void
であり、それを MyType
にキャストしようとしています。void
はキャストできないため、コンパイルエラーになります。
C)(3)
→ エラーになりません。b
を MyType
にキャストした後、print("three")
を呼び出しています。b
の実際の型は MyClass
なので、キャストは有効であり、コンパイルエラーにはなりません。
D)(4)
→ エラーになりません。t
は MyType
型の変数で、MyClass
のインスタンスが代入されています。t.print("four")
は問題なく MyClass
のメソッドを呼び出します。
E)(5)
→ エラーになります。(MyType)t.print("five")
は t.print("five")
が void
を返すため、void
に対してキャストしようとしてエラーになります。
F)(6)
→ エラーになります。((MyType)t).print("six")
はキャスト自体は正しいですが、キャストは不要です。t
は既に MyType
型なので、明示的なキャストは不要です。冗長なキャストはエラーを引き起こします。
G)(7)
→ エラーになりません。sealed
インターフェースと permits
は適切に使用されており、MyClass
がインターフェースを実装しているので問題ありません。
H)(8)
→ エラーになりません。Base
クラスは正しく定義されており、DELIMITER
は MyClass
で問題なく使用されています。
I)(9)
→ エラーになりません。MyClass
は Base
クラスを拡張し、MyType
インターフェースを実装しているので、問題なくコンパイルされます。
対象資格:Java SE17 認定資格