Java通用接口性能

简单的问题,但我猜是棘手的答案.

使用通用接口会损害性能吗?

例:

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)

调用.那个方法,在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方法.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...