java泛型编译时被擦除引起多态的破坏,用 桥方法解决此类问题。(java 桥方法)

在JVM虚拟机中泛型编译的时候,会出现类型擦除。但是,在多态场景中,编译时,擦除方式会出现多态被破坏的可能。

举个栗子:

A.java

public class A<T> {
void g(T t){ }
}

B.java

public class B extends A<String>{

	@Override
void g(String s){ }
}

  在编译之后的字节码:

java泛型编译时被擦除引起多态的破坏,用 桥方法解决此类问题。(java 桥方法)

看到B.class里面有两个方法g(java.lang.String)和g(java.lang.Object),并没有对父类方法进行重载,而是重写。如果这样就会出问题。

但是我们现在的继承,并没有问题。

因为在java中,会有一个桥方法来解决这类问题。

java泛型编译时被擦除引起多态的破坏,用 桥方法解决此类问题。(java 桥方法)

从字节码中科院看到,其实调用B类的时候,还是调用的g(java.lang.Object)方法,但是,最终g(java.lang.Object)会调用g(java.lang.String)方法。但是调用的g(java.lang.Object)方法,为什么在B.g方法中,传入的参数不是String类型的时候,会报错?这是因为泛型的类型安全引起的,并不是桥方法引起的。

上一篇:MyEclipse优化全攻略


下一篇:C# 动态添加类、动态添加类型、代码添加类型