在JVM虚拟机中泛型编译的时候,会出现类型擦除。但是,在多态场景中,编译时,擦除方式会出现多态被破坏的可能。
举个栗子:
A.java
public class A<T> {
void g(T t){ }
}
B.java
public class B extends A<String>{ @Override
void g(String s){ }
}
在编译之后的字节码:
看到B.class里面有两个方法g(java.lang.String)和g(java.lang.Object),并没有对父类方法进行重载,而是重写。如果这样就会出问题。
但是我们现在的继承,并没有问题。
因为在java中,会有一个桥方法来解决这类问题。
从字节码中科院看到,其实调用B类的时候,还是调用的g(java.lang.Object)方法,但是,最终g(java.lang.Object)会调用g(java.lang.String)方法。但是调用的g(java.lang.Object)方法,为什么在B.g方法中,传入的参数不是String类型的时候,会报错?这是因为泛型的类型安全引起的,并不是桥方法引起的。