【发布时间】:2011-09-10 20:47:55
【问题描述】:
我在 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 方法里面我有下面的代码sn-p
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后的编译代码是什么?
【问题讨论】:
-
您的示例中的第 4 行不起作用。它将触发编译器错误,因为类型(
Box<Integer>和Box<String>)不匹配。 -
在大多数情况下,Type Erasure 意味着它使字节码不需要知道泛型类型(生成一些额外的代码),但是在许多方面它就像调用 Comment Erasure 一样。 ;)
-
类型擦除不是功能,“泛型”是。类型擦除是实现泛型时的一种设计选择,用表达性换取二进制兼容性。
标签: java generics type-erasure