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
(またはそれに類するもの)。