[英]How Type Erasure work in java?
我正在浏览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
类时,它将分别从Box
类和main
方法中删除所有T
, <String>
, <Integer>
? 如果是,删除T
之后的编译代码是什么?
类型擦除发生在编译时。 Java编译器从源中删除那些泛型类型信息,并根据需要添加强制类型转换并提供字节码。 因此,生成的字节码将不包含有关类型参数和参数的任何信息。 看起来像没有泛型的旧Java代码。 无法在运行时确定T的值,因为在编译代码之前会删除该信息。
在没有示例代码那样的类型限制的情况下,在Box类中(大致)会发生这种情况,方法代码中对T
的所有引用的所有实例都将被Object 替换 。 在使用Box类的代码中,所有<String>
, <Integer>
等实例都将被删除 。
关于Java泛型的详尽详尽的文章是Angelika Langer的FAQ-还解释了类型边界的影响以及更多内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.