BridgeMethod

2019-10-22  本文已影响0人  timar

jdk1.5引入泛型之后,子类继承抽象父类或实现接口后,在重写带泛型的方法时,java在编译时会自动补上一个bridgeMethod。

泛型擦除:在带有泛型的类在编译成Class文件后,其中的泛型T等都会编译成Object

public interface Super<T> {
    T get(T t);
}
public class Sub implements Super<String> {

    @Override
    public String get(String s) {
        return s.concat("a");
    }
    public static void main(String[] args) {
        Super sub = new Sub();
        sub.get(new Object());
    }
}

编译成Class文件后应该是

public interface Super {
    Object get(Object t);
}
public class Sub implements Super {

    @Override
    public String get(String s) {
        return s.concat("a");
    }

    // 生成的BridgeMethod
    @Override
    public Object get(Object s) {
        return this.get((String) s);
    }

    public static void main(String[] args) {
        Super sub = new Sub();
        sub.get(new Object());
    }
}

所以这里,如果没有生成bridgeMethod的话,Sub类就没有实现Super类的get方法,不符合java语义。
这里在运行时也会报类型转换异常。
总结就是,jvm是没有泛型这个概念的(所以有泛型擦除,T换成Object),纯粹是java提供的一个便利。

上一篇 下一篇

猜你喜欢

热点阅读