5

私は次のようにJavaに2つのクラスがあります:

class A {

 int a=10;

 public void sayhello() {
 System.out.println("class A");
 }
}

class B extends A {

 int a=20;

 public void sayhello() {
 System.out.println("class B");
 }

}

public class HelloWorld {
    public static void main(String[] args) throws IOException {

 B b = (B) new A();
     System.out.println(b.a);
    }
}

コンパイル時にはエラーは発生しませんが、実行時にはエラーが表示されます: Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B

4

4 に答える 4

16

これは、 のコンパイル時の式の型new A()A-のインスタンスへの参照になる可能性Bがあるため、キャストが許可されているために発生します。

ただし、実行時には、参照は単にA- のインスタンスに対するものであるため、キャストは失敗します。のインスタンスは のインスタンスではA ありませんB。キャストは、参照が実際にインスタンスBまたはサブクラスを参照している場合にのみ機能します。

于 2010-06-22T11:57:35.277 に答える
7

BはAを拡張するため、BをAとしてキャストできます。ただし、その逆は当てはまりません。AのインスタンスをBとしてキャストすることはできません。

Javascriptの世界から来ている場合は、これが機能することを期待しているかもしれませんが、Javaには「ダックタイピング」がありません。

于 2010-06-22T12:00:12.687 に答える
0

子クラスのオブジェクトを作成すると、それをスーパークラスに型キャストすることはできません。以下の例を見てください

前提: Dog は Animal(SuperClass) を継承する子クラスです。

通常のタイプキャスト:

Dog dog = new Dog();
Animal animal = (Animal) dog;  //works

間違ったタイプキャスト:

Animal animal = new Animal();
Dog dog = (Dog) animal;  //Doesn't work throws class cast exception

以下の Typecast は実際に機能します。

Dog dog = new Dog();
Animal animal = (Animal) dog;
dog = (Dog) animal;   //This works

コンパイラは実行時に構文をチェックし、コンテンツは実際に検証されます

于 2015-04-10T12:58:57.317 に答える