简单的问题,但我猜是棘手的答案.
使用通用接口会损害性能吗?
例:
public interface Stuff<T> { void hello(T var); } vs public interface Stuff { void hello(Integer var); <---- Integer used just as an example }
我的第一个想法是,它没有.泛型只是语言的一部分,编译器会优化它,好像没有泛型(至少在通用接口的这种特殊情况下).
它是否正确?
解决方法
由于编译器有时会添加合成桥接方法,因此可能会出现轻微的性能损失.请考虑以下示例:
public class GenericPerformance { public static void main(final String[] args) { final Stuff<Integer> stuff = new IntStuff(); final Integer data = stuff.getData(); stuff.putData(data); } } interface Stuff<T> { T getData(); void putData(T stuff); } class IntStuff implements Stuff<Integer> { 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)
java.lang.Object getData() void putData(java.lang.Object)
两者都用修饰符公共桥合成,委托给“真实”方法
java.lang.Integer IntStuff.getData() void putData(java.lang.Integer)
第一个合成方法只返回Integer结果,而第二个合成方法在调用putData(Integer)之前执行从Object到Integer的转换.