プログラムのコンパイル時に// 1でマークされた行にエラーがないのに、実行時にエラーが発生するのはなぜですか。私はJavaを初めて使用するので、クラスがどのように機能するかをよりよく理解しようとしています。
class A{
private int x;
}
class B extends A{
private int a;
void exec(){
System.out.println("test");
}
static void function(A a){
((B)a).exec();//1
}
public static void main(String argv[]){
B.function(new A());
B.function(new B());
}
}
基本的に、Javaでは、キャストが成功する可能性がある場合、つまり、がスローされない可能性がある場合に、参照型を別の参照型にキャストできますClassCastException
。もちろん、成功することを保証することはできません。これまで見てきたように、A
への参照はB
オブジェクトを参照している可能性がありますが、B
オブジェクトではない可能性があります。
JLSのセクション5.5.1では、元の参照型(S)とキャスト型(T)の両方がクラス型である場合にコンパイラエラーが発生する原因について詳しく説明しています。
コンパイル時参照型S(ソース)とコンパイル時参照型T(ターゲット)が与えられた場合、以下の規則によりコンパイル時エラーが発生しなければ、SからTへのキャスト変換が存在します。
Sがクラスタイプの場合:
- Tがクラス型の場合、| S |のいずれか <:| T |、または| T | <:| S |。そうしないと、コンパイル時エラーが発生します。
(<:
JLSの表記は、「のサブタイプ」を意味します。)
B
はのサブタイプであるためA
、aA
からaへのキャストB
は合法です。これは、成功する可能性があるためです。対照的に、たとえばString
、無関係な型にキャストすると、コンパイラエラーが発生します。そのキャストは成功できません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加