1

以下のコードスニペットで、Class>B>をClass>A>にキャストしようとしているときに、1が実行時例外を生成しないのはなぜですか?

package example;

Class A {
   public A() {
   }
}

Class B extends A {
   public B() {
   }
}

public static void main() {

    Class<A> c = null;

    //1. Does not produce exception at run-time even though I cast Class<B> to Class<A>
    try {
        c = (Class<A>) Class.forName("example.B");
    } catch (ClassNotFoundException e) {
    }

    //2. Compile time error: Cannot Cast Class<B> to Class<A>
    c = (Class<A>) B.class; //Error
}
4

3 に答える 3

3

Class.forName()を返します。これは、 (ジェネリックなしで)Class<?>ほぼ同等です。Class

2番目のバージョンは、間に別の非ジェネリックキャストを追加した場合にもコンパイルされます。

c = (Class<A>)(Class) B.class; // compiles

ただし、これは正しくないため、コンパイラーはこのエラーからあなたを救います。最初のバージョンでは、それはできません。

于 2012-06-30T09:42:37.193 に答える
1

ジェネリックは、Java仮想マシンではなくコンパイラによってのみ適用されるためです。コンパイル中にコンパイラによってクリアされたように考えることができます。Javaジェネリックは、以前のJavaバージョンとの下位互換性のためにこのように実装されています。

于 2012-06-30T09:36:12.727 に答える
1

Javaジェネリックは消去によって実装されます。つまり、ジェネリックはコンパイル時にチェックされますが、実行時には使用できません。これにより、ジェネリックスを含むJavaコードを1.5より前のコードと下位互換性を持たせることができます。

于 2012-06-30T09:42:26.453 に答える