1. ホーム
  2. java

[解決済み] Javaにおけるダウンキャスティング

2022-02-16 12:27:24

質問

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");
  }
}

解決方法は?

ダウンキャストは、実行時に成功する可能性がある場合に許可されます。

Object o = getSomeObject(),
String s = (String) o; // this is allowed because o could reference a String

場合によっては、成功しないことがあります。

Object o = new Object();
String s = (String) o; // this will fail at runtime, because o doesn't reference a String

実行時にキャスト(この最後のキャストのような)が失敗すると ClassCastException が投げられます。

それ以外の場合は動作します。

Object o = "a String";
String s = (String) o; // this will work, since o references a String

一部のキャストはコンパイル時に禁止されることに注意してください。

Integer i = getSomeInteger();
String s = (String) i; // the compiler will not allow this, since i can never reference a String.