Java泛型类型擦除:何时以及发生了什么?
我在Oracle的网站上读到了Java的类型擦除。
什么时候发生类型擦除?在编译时还是运行时?当班级加载?当类被实例化时?
很多站点(包括上面提到的官方教程)都说在编译时会发生类型擦除。如果在编译时完全删除了类型信息,那么当调用使用泛型的方法而没有类型信息或错误的类型信息时,JDK如何检查类型兼容性?
考虑以下示例:Say class A
有一个方法,empty(Box<? extends Number> b)
。我们编译A.java
并获取类文件A.class
。
public class A { public static void empty(Box<? extends Number> b) {}}
public class Box<T> {}
现在我们创建另一个类B
,该类empty
使用非参数化参数(原始类型)调用该方法:empty(new Box())
。如果我们编译B.java
与A.class
在类路径中,javac的是足够聪明,引发警告。所以A.class
有一些类型信息存储在其中。
public class B { public static void invoke() { // java: unchecked method invocation: // method empty in class A is applied to given types // required: Box<? extends java.lang.Number> // found: Box // java: unchecked conversion // required: Box<? extends java.lang.Number> // found: Box A.empty(new Box()); }}
我的猜测是类加载时会发生类型擦除,但这只是猜测。那么什么时候发生?
森林海
红颜莎娜
相关分类