一、概念
桥接顾名思义,就是为了兼容java的jdk之前的版本,对于泛型,是在jdk1.5引入的,那之前的版本该如何兼容呢?我们来看个例子。
二、示例
1)定义一个接口
public interface SuperClass<T>{
void method(T t);
}
2)定义该接口的实现类
public class AClass implements SuperClass<String>{
@Override
public void method(String s) {
System.out.println(s);
}
}
3) 泛型是在1.5引入的,为了向前兼容,所以会在编译时去掉泛型(泛型擦除)。那么SuperClass接口中的method方法的参数在虚拟机中只能是Object。擦除后的接口如下:
public interface SuperClass {
void method(Object t);
}
4)但是实现类的方法却是这样的:
public void method(String s) {
System.out.println(s);
}
5) 根本就没有实现 void method(Object t) 方法。 这怎么回事,其实虚拟机自动实现了一个方法
6)通过javap -p AClass.class 反编译class文件,如下,豁然开朗。
Compiled from "AClass.java"
public class com.hzq.AClass implements com.hzq.SuperClass<java.lang.String> {
public com.hzq.AClass();
public void method(java.lang.String);
public void method(java.lang.Object);
}
7)通过isBridge()测试
public static void main(String[] args)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
AClass obj = new AClass();
Method m = AClass.class.getMethod("method", String.class);
m.invoke(obj, "XXXXXXXXXXXXXXXXXX");
System.out.println(m.isBridge());
m = AClass.class.getMethod("method", Object.class);
m.invoke(obj, "##################");
System.out.println(m.isBridge());
}
结果如下:
三、原文链接
https://www.cnblogs.com/zsg88/p/7588929.html