虚拟机没有泛型对象,所有对象都属于普通类,使用当前Sun的编译器来编译Java泛型代码,结果类将不能再5.0以前的虚拟机上运行。定义的泛型类型,都自动提供了一个相应的原始类型(raw type)原始类型的名字就是删去类型参数后的泛型名,擦出掉类型变量,并替换为限定类型(无限定的变量用Object)例如前文中提到的 Pair<T> 的raw type如下:
public class Pair
{ //因为T是一个无限定类型的变量,所以直接用Object替换,如果有限定的类型,就用第一个限定的类型变量来替换,否则用Object替换
public Pair(Object first, Object second) {
this.first = first;
this.second = second;
}
public Object getFirst() { return first; }
public Object getSecond() { return second; }
public void setFirst(Object newValue) { first = newValue; }
public void setSecond(Object newValue) { second = newValue; }
private Object first;
private Object second;
}
以上结果类似一个普通类,就像泛型引入Java之前已经实现的那样。原始类型被替换后,编译器在必要时要插入强制类型转换,通过桥接法来合成保持多态。
调用遗留代码
Java SE5之前不支持泛型,不过可以通过将泛型类与遗留的API中原始的对应概念放在一起使用。可以通过添加注释(annotation)使警告消失,
@SuppressWarnings("unchecked") //添加注释, 注释必须放在被警告的代码所在方法的前面
public void configureSlider() { . . . }