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提供的一个便利。
网友评论