Java でのダウンキャスト: コンパイル エラーの詳細
Java のオブジェクト指向の性質により、サブクラスのオブジェクトをアップキャストすることができます。そのスーパークラスの変数に割り当てられます。ただし、ダウンキャストとして知られる逆の操作を実行しようとすると、通常、コンパイル エラーが発生します。
このコンパイル エラーは、ダウンキャスト オブジェクトが実際にキャストで指定された型を持つことをコンパイラが保証できないために発生します。 。以下の例を考えてみましょう。
public class demo { public static void main(String a[]) { B b = (B) new A(); // compiles with the cast, // but runtime exception - java.lang.ClassCastException } } class A { public void draw() { System.out.println("1"); } public void draw1() { System.out.println("2"); } } class B extends A { public void draw() { System.out.println("3"); } public void draw2() { System.out.println("4"); } }
この例では、コンパイラは、A オブジェクトの型 B の変数への代入 (ダウンキャスト) を許可します。ただし、実行時にコードが B クラスでのみ使用できるメソッドを呼び出そうとすると、java.lang.ClassCastException がスローされます。この実行時エラーは、実際のオブジェクトの型とキャストで指定された型との不一致を示します。
Java が実行時に失敗する可能性があるにもかかわらずダウンキャストを許可するというのは直観に反しているように思えるかもしれません。ただし、状況によってはダウンキャストが正当化され、成功する可能性さえあります。一般的なシナリオの 1 つは、実行時に変数が特定のサブクラスのオブジェクトを保持することがわかっている場合です。例:
Object o = getSomeObject(); if (o instanceof String) { String s = (String) o; // This cast is valid as o is known to be a String at this point in the code }
この例では、getSomeObject() メソッドは、String クラスのインスタンスである可能性があるオブジェクトを返します。 instanceof キーワードは、参照が String クラスと互換性があるかどうかを確認するために使用されます。チェックが成功すると、o 参照が String オブジェクトを保持していることが保証され、実行時にダウンキャスト操作が安全かつ成功します。
ダウンキャストには他にも実際的な使用例があります。たとえば、スーパークラスで公開されていないサブクラス固有のメソッドやフィールドにアクセスするために使用できます。ただし、オブジェクトが予期されるサブクラス型であることがわかっている場合にのみダウンキャストが実行されるようにすることが重要です。
以上がJava のダウンキャストによってコンパイル エラーが発生するのはなぜですか?また、それが安全なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。