泛型代码和虚拟机
对于虚拟机来说,没有泛型类型对象,所有对象都属于普通类
+ 任何一个泛型类都提供了一个相应的原始类型(原始类型就是删除类型参数后的泛型类型名)
+ 擦除类型变量,并且替换为限定类型(无限定的变量用Object)
在擦除类型的时候如果没有限定类型就用Object,如果有就采用第一个限定类型
Pair 擦除类型后如下所示
public class Pair{
private Ojbect fisrt;
private Object second;
public Pair(Object first,Object scond){
this.first = first;
this.second = second;
}
public Object getFirst(){
return first;
}
public Object getSecond(){
return sencod;
}
public void setFirst(Object newValue){
first = newValue;
}
public void setSecond(Object newValue){
second = newValue;
}
}
Interval有限定类型擦除后的表达式
- 未擦除前
java
public class Interval<T extends Comparable & Serializable> implements Serializable{
private T lower;
private T upper;
...
public Interval(T frist,T second){
if(first.compareTo(second<=0 )){
lower = first;
upper = second;
}
}
}
擦除后的类型
public class Interval implements Serializable{ private Comparable lower; private Comparable upper; ... public Interval(Comparable frist,Comparable second){ if(first.compareTo(second<=0 )){ lower = first; upper = second; } } }
在这里如果我们切换限定: class Interval
翻译泛型表达式
当程序调用泛型方法时,如果擦除返回类型,编译器将插入强制类型转换
Pair<Employee> buddies = ...;
Employee buddy = buddies.getFirst();
擦除后getFirst的返回类型将返回Object类型.编译器将自动插入Employee类的强制类型转换。编辑器将把这个方法的调用编译为两条虚拟机指定:
1. 将原始方法Pair.getFisrt的调用
2. 将返回的Object类型强制转换为Employee类型
翻译泛型方法
类型擦除也会出现在泛型方法中.
public static <T extends Comprable> T min(T[] a)
类型擦除后如下
publci static Comparable min(Comparable[] a)
java泛型转换的事实
- 虚拟机中没有泛型,只有普通的类方法
- 所有的类型参数都要用他们的限定类型替换
- 桥方法被合成来保持多态
- 为了保持类型安全性,必要时插入强制类型转换