Java Silverを学習中、クラスのキャストについて学んだことがあったので復習も兼ねて投稿します。
■クラスのキャストによるエラー
クラスをキャストする際には、コンパイルエラーをする場合と実行時エラーとなる場合がある。
public class A {}
public class B extends A {}
public class C extends A {}
public class Main {
public static void main(String[] args) {
// 実行時エラーのパターン
A a1 = new A();
B b1 = (B)a1;
// コンパイルエラーのパターン
B b2 = new B();
C c = (C)b2;
}
}
■解説
結論:可能性があるなら実行時エラー、全く関係ないならコンパイルエラー
AとBの関係
AとBの場合、両者にはスーパークラスとサブクラスという関係があるので、キャストが成功する可能性もある。
以下のような場合はコンパイルも実行も成功する。
public class A {}
public class B extends A {}
public class Main {
public static void main(String[] args) {
A a1 = new B(); // ポリモーフィズムによる生成であれば、このキャストは成功する。
B b1 = (B)a1;
}
}
失敗のケースでは、A型でAインスタンスを代入している。
AはBを継承しているわけではないので、A型のインスタンスを参照に持っているa1を、Bにキャストすることはできない。
BとCの関係
BとC間には継承関係等の関係は全くない。全く関係のない型をキャストすると、コンパイルエラーになる。
参考文献