由于编译器有时会添加合成桥接方法,因此可能会出现轻微的性能损失.请考虑以下示例:
public class GenericPerformance {
public static void main(final String[] args) {
final Stuff stuff = new IntStuff();
final Integer data = stuff.getData();
stuff.putData(data);
}
}
interface Stuff {
T getData();
void putData(T stuff);
}
class IntStuff implements Stuff {
private Integer stuff;
public Integer getData() {
return stuff;
}
public void putData(final Integer stuff) {
this.stuff = stuff;
}
}
如果查看生成的字节码,您将看到:在main方法中,擦除了接口方法
java.lang.Object Stuff.getData()
void Stuff.putData(java.lang.Object)
被调用.那个方法,在IntStuff中用签名实现
java.lang.Object getData()
void putData(java.lang.Object)
两者都用修饰符公共桥合成,委托给“真实”方法
java.lang.Integer IntStuff.getData()
void putData(java.lang.Integer)
第一个合成方法只返回Integer结果,而第二个合成方法在调用putData(Integer)之前执行从Object到Integer的转换.
如果将stuff变量更改为IntStuff类型,则调用两个Integer方法而不是合成Object方法.