泛型代码和虚拟机
虚拟机没有泛型类型,只有普通的类和方法。无论何时定义一个泛型类型,都自动提供一个相应的原始类型。原始类型的名字就是删除类型参数后的泛型类型名。擦除类型变量,并替换为限定类型,无限定类型的变量用Object。
Pair<T>的原始类型,因为T是一个无限定的变量,所有直接用Object替换。
public class Pair {
private Object first;
private Object second;
public Pair() {
first=null;
second=null;
}
public Pair(Object firsObject, Object second) {
this.first = firsObject;
this.second = second;
}
public Object geObjectFirsObject() {
return first;
}
public void seObjectFirsObject(Object firsObject) {
this.first = firsObject;
}
public Object geObjectSecond() {
return second;
}
public void seObjectSecond(Object second) {
this.second = second;
}
}
如果有限定类型,就用第一个限定的类型变量来替换。比如Pair<T extends Comparable & Serializable >
public class Pair {
private Comparable first;
private Comparable second;
public Pair() {
first=null;
second=null;
}
public Pair(Comparable first, Comparable second) {
this.first = first;
this.second = second;
}
}
如果切换限定列表,Pair<T extends Serializable & Comparable>,原始类型就用Serializable替换T,为了提高效率,应该讲标签接口(即没有方法的接口)放在类别的末尾。
翻译泛型表达式
当程序调用泛型方法时,如果擦除返回类型,编译器插入强制类型转换。
Pair<Employee> buddies = new Pair();
Employee buddy = buddies.getFirst();
擦除getFirst的返回类型后将返回Object类型,编译器自动插入Employee的强制类型转换,也就是说,编译器把这个方法调用翻译为两条虚拟机指令:
- 对原始方法Pair.getFirst的调用。
- 将返回的Object类强制转换为Employee类型。