スーパークラスからサブクラスへの明示的なキャスト 質問する

スーパークラスからサブクラスへの明示的なキャスト 質問する
public class Animal {
    public void eat() {}
}

public class Dog extends Animal {
    public void eat() {}

    public void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = (Dog) animal;
    }
}

代入ではDog dog = (Dog) animal;コンパイル エラーは発生しませんが、実行時に が生成されますClassCastException。なぜコンパイラはこのエラーを検出できないのでしょうか?

ベストアンサー1

キャストを使用すると、本質的にはコンパイラーに「私を信じてください。私はプロです。自分のやっていることはわかっています。保証はできませんが、このanimal変数は間違いなくダメになるだろうと伝えています」と伝えていることになります。

動物は実際には犬ではないため (動物であり、Animal animal = new Dog();犬にすることもできます)、信頼を侵害したため (コンパイラにすべてが正常であると伝えましたが、そうではありません)、VM は実行時に例外をスローします。

コンパイラは、すべてを盲目的に受け入れるよりも少し賢く、異なる継承階層でオブジェクトをキャストしようとすると(たとえば、Dog を String にキャストする)、コンパイラはそれが決して機能しないことを知っているので、それを返してくれます。

ClassCastException基本的にはコンパイラのエラーを止めているだけなので、キャストするたびに、if ステートメントでの使用によってエラーが発生しないことを確認することが重要ですinstanceof(またはそれに類するもの)。

おすすめ記事