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()return Class<?>,大致相当于Class(没有泛型)。

如果您在中间添加另一个非泛型转换,第二个版本也将编译:

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 回答