Java泛型转换的本质:
1、虚拟机中没有泛型,只有普通的类和方法;
2、所有的类型参数都用它们的限定类型转换;
3、桥方法被合成来保持多态;
4、为保持类型安全性,必要时插入强制类型转换。
桥方法:前提DateInterval extends Pair
DateInterval interval = new DateInterval(……);
Pair<Date> pair = interval;
pair.setInfo(value);
这里,希望对setInfo的调用具有多态性,并调用最适合的方法;由于父类引用指向子类对象,所以应该调用
DateInterval.setInfo方法,但是类型擦除与多态发生冲突,此时编译器就在DateInterval类中生成一个桥方法;
public void setInfo(Object value)
{
setInfo((Date)value);
}
以上语句的工作过程:
pair.setInfo(value)
变量pair已经声明为类型Pair<Date>,并且这个类型中有一个简单的方法叫setInfo,即setInfo(Object obj)。虚拟机用pair引用的对象调用这个方法,这个对象是DateInterval类型,因而将会动态绑定地调用
Dateinterval.setInfo(Object obj)方法,这个方法是合成的桥方法,它调用
DateInterval.setInfo(Date d)方法,达到代码中多态的效果。 |
|