Java泛型 – 类型擦除 – 何时发生

问题:

我读了Java的类型erasure on Sun’s website
 何时发生类型擦除?在编译时/运行时?当类加载/运行时?当课程被实例化时?
很多网站(包括上面提到的Sun教程)都说编译时发生类型擦除。如果在编译时完全删除了类型信息,那么当调用使用泛型的方法时,没有类型信息或错误的类型信息,JDK检查类型的兼容性如何。
考虑以下示例:说A类有一个方法empty(Box<? extends Number> b)。我们编译A.java并获取类文件A.class。
现在我们创建另一个类B,它使用非参数化参数(原始类型) – empty(new Box())调用方法为空。如果我们在类路径中用A.class编译B.java,javac就足以引起警告。所以A.class has中存储一些类型的信息。
我的猜测是,类加载时会发生类型擦除,但这只是一个猜测。那么什么时候发生?

回答:

类型擦除适用于use泛型。类文件中绝对有元数据来表示方法/类型is泛型,约束等等。但是当泛型为used时,它们将转换为编译时检查和执行时间转换。所以这段代码:

List<String> list = new ArrayList<String>();
list.add("Hi");
String x = list.get(0);

被编入

List list = new ArrayList();
list.add("Hi");
String x = (String) list.get(0);

在执行时,无法找出列表对象的T=String – 信息已经消失。
…但是List<T>接口本身仍然是通用的。
编辑:为了澄清,编译器确实保留了variableList<String>的信息,但您仍然无法找到列表对象本身的T=String

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Java generics – type erasure – when and what happens

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

30 − = 28