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){
		
	}
}

  在编译之后的字节码:

看到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类型的时候,会报错?这是因为泛型的类型安全引起的,并不是桥方法引起的。

 

posted @ 2016-07-28 10:18  吐槽村  阅读(632)  评论(2编辑  收藏  举报