ダウンキャストの失敗
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
Animal a = new Cat();
Dog d = (Dog) a;
System.out.println("ok");
}
}
class Animal {
}
class Dog extends Animal {
}
class Cat extends Animal {
}
- A
okと出力される - B 実行時に例外が発生する
- C コンパイルエラーになる
- D 何も出力されない
正解と解説を見る
正解: B
- A: a の中身は Cat なので、Dog へのキャストで実行時に例外が発生し、ok まで進みません。
- B: a の実体は Cat です。Dog にキャストすると ClassCastException が発生します。
- C: Animal から Dog へのダウンキャストは、継承関係があるのでコンパイルは通ります。
- D: ok の前で例外が発生し、スタックトレースが出力されます。
ポイント
- Animal から Dog へのキャストは型としてはあり得るので、コンパイルは通ります。
- 実体は Cat なので、実行時に
ClassCastExceptionが発生します。
「参照型のキャストとポリモーフィックなメソッド呼び出し」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)