ID非公開

2023/11/13 21:57

33回答

Javaについて質問します。 下記の問題において、なぜ15行目で実行エラーが出てこないのでしょうか。 サブクラスにスーパークラスをキャストしたら実行エラーが出てくると習いました。

画像

ベストアンサー

NEW! この回答はいかがでしたか? リアクションしてみよう

その他の回答(2件)

スーパークラスをサブクラスにキャストした場合、そのスーパークラスの実体がサブクラスだとは限りません。 もしもそのスーパークラスの実体がサブクラスではなかった場合、実行エラーが出て来ます。 逆に、もしもそのスーパークラスの実体がサブクラスであった場合、実行エラーは出て来ません。

キャストに関しては、 1.コンパイルエラーになるケース 2.実行時エラーになるケース 3.コンパイルも実行も通るケース の3つに分類されます。 1.コンパイルエラーになるケース 明らかにキャストできないと判別できる時に発生します。 例) class A { } classs C { } public class Main { public static void main(String[] args) { A a = (A) new C(); } } AクラスとCクラスの間に継承関係がないので、CクラスのインスタンスはAクラスにキャストできません。 よって、「A a = (A) new C();」でコンパイルエラーが発生します。 「明らかにキャストできない」と判別できない場合は、コンパイルが通ります。 例) class A { } classs B extends A { } public class Main { public static void main(String[] args) { B b = (B) new A(); } } AクラスとBクラスの間には継承関係があるので、AクラスのインスタンスをBクラスにキャストできるかもしれません。 この様な可能性がある場合は、コンパイルが通ります。 2.実行時エラーになるケース 実行時に実際にキャストを試してみて、それができなかった時に発生します。 例) class A { } classs B extends A { } public class Main { public static void main(String[] args) { B b = (B) new A(); } } AクラスはBクラスの親です。 親クラスのインスタンスは子クラスにはキャストできないので、「B b = (B) new A();」で実行時エラーとなります。 3.コンパイルも実行も通るケース 例) class A { } classs B extends A { } public class Main { public static void main(String[] args) { A a = (A) new B(); B b = (B) a; } } BクラスはAクラスの子供です。 子クラスのインスタンスは親クラスにキャストできるので、「A a = (A) new B();」は実行できます。 また変数aはAクラスの変数として宣言されていますが、実際の中身はBクラスのインスタンスです。 BクラスのインスタンスはBクラスにキャストできますから、「B b = (B) a;」も通ります。 質問のコードは3番のケースに該当するので、コンパイルエラーも実行時エラーも発生しません。