Java では、スーパークラスからサブクラスへのオブジェクトのキャストが常に有効な操作であるとは限りません。この不一致により、コンパイラがコンパイル中にエラーを検出しなかった場合でも、ClassCastException が発生する可能性があります。
次のコード スニペットを検討してください。
public class Animal { public void eat() {} } public class Dog extends Animal { public void eat() {} public static void main(String[] args) { Animal animal = new Animal(); Dog dog = (Dog) animal; } }
上記のコードを実行すると、実行時に ClassCastException がスローされます。これは、Animal 参照 (animal) を Dog 参照 (dog) にキャストすることが安全でない操作であるために発生します。コンパイラは考えられるすべてのシナリオを予測することはできず、そのような操作の有効性を保証するのはプログラマに依存しています。
このランタイム エラーの主な理由は、animal 変数によって参照される実際のオブジェクトが次のインスタンスであることです。 Dog クラスではなく、Animal クラスです。明示的なキャストを実行することにより、プログラマは本質的に、オブジェクトの型を完全に知っていると宣言し、それが実際に Dog オブジェクトであると主張します。ただし、この場合、このアサーションは正しくありません。
このようなシナリオを適切に処理するには、キャストする前に if ステートメント内で instanceof 演算子を使用して、オブジェクトの実際の型を検証することをお勧めします。
if (animal instanceof Dog) { Dog dog = (Dog) animal; }
この追加チェックにより、本当に目的のタイプのオブジェクトのみがキャストされることが保証され、次の時点で ClassCastException エラーが発生する可能性が最小限に抑えられます。ランタイム。
以上がJava でスーパークラス オブジェクトをサブクラスにキャストすると ClassCastException がスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。