我在http://download.oracle.com/javase/tutorial/java/generics/erasure.html处理了TypeErasure主题 该编译器删除与类参数相关的所有信息,并在类或方法中键入参数。
现在考虑下面的代码
public class Box<T> {
private T t; // lineA, T stands for "Type"
public void add(T t) { // lineB
this.t = t; // lineC
}
public T get() { // lineD
return t; // lineE
}
}
现在我在main
方法内部的代码片段
Box<String> box1 = new Box<String>(); // line1
box1.add("Scott"); // line2
String s1tr=box1.get(); // line3
Box<Integer> box2 = new Box<Integer>(); // line4
box2.add(1); // line5
Integer k=box2.get(); // line6
现在在上面的代码中(在Box
类和main
方法中)编译器将做出哪些更改以及在哪一行?
正如链接所说编译器在编译时删除了类或参数中与类型参数和类型参数相关的所有信息
将编译Box
类,是否会分别从T
类和<String>
方法中删除所有<Integer>
,Box
,main
?如果是,删除T
后的编译代码是什么?
答案 0 :(得分:3)
类型擦除在编译时发生。 Java编译器从源中删除这些泛型类型信息,并根据需要添加强制转换并提供字节代码。因此,生成的字节代码将不包含有关类型参数和参数的任何信息。 它看起来像没有泛型的旧Java代码。 无法在运行时确定T的值,因为在编译代码之前会删除该信息。 / p>
答案 1 :(得分:2)
如果没有像示例代码中那样的类型边界,那么(大致)会发生在Box类中,方法代码中对T
的所有引用的所有实例都将被替换按对象。在使用Box类的代码中,<String>
,<Integer>
等所有实例都将删除。
关于Java Generics的详尽深入的文章是Angelika Langer's FAQ - 它还解释了类型边界的影响等等。