1. ホーム
  2. java

[解決済み] スーパークラスからサブクラスへの明示的なキャスト

2022-04-23 05:35:49

質問

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 . なぜコンパイラはこのエラーを検出できないのでしょうか?

解決方法は?

キャストを使用することは、本質的にコンパイラに「私を信じてください」と伝えていることになります。私はプロフェッショナルで、自分が何をしているのか分かっていますし、保証はできませんが、次のことを伝えているのです。 animal 変数は間違いなく犬になる。

この動物は実際には犬ではないので(動物だから Animal animal = new Dog(); というのも、あなたは信頼に背いたからです(あなたはコンパイラにすべて大丈夫だと言ったのに、そうではなかったのです!)。

もし、異なる継承階層のオブジェクトをキャストしようとすると(たとえば、犬を文字列にキャストする)、コンパイラは、それがうまくいくはずがないことを知っているので、あなたに投げ返します。

基本的にはコンパイラから文句を言わせないようにするだけなので、キャストのたびに ClassCastException を使用することで instanceof をif文の中に入れる(あるいはそのような趣旨のことをする)。