java在1.5带来了泛型操作,但是在虚拟机底层字节码而言,只有普通方法和变量,没有泛型这一说,为了实现相关功能:
public interface IHello<T> {
public void sayHello(T t);
}
public class HelloWorld implements IHello<String> {
@Override
public void sayHello(String s) {
System.out.println("hello "+s);
}
}
public class BridgeMethodTest {
public static void main(String[] args) {
Method[] methods= HelloWorld.class.getDeclaredMethods();
for (Method m:methods){
System.out.println(m.getName()+" , "+ Arrays.toString(m.getParameterTypes()));
}
}
}
我们只实现了一个方法,但是为什么通过反射却获取到了两个同名但是参数不同的方法,这里第二个方法其实就是桥接方法,简单来说,在虚拟机编译的时候,进行了泛型擦除,上述代码虚拟机端展示如下:
public interface IHello {
public void sayHello(Object t);
}
public class HelloWorld implements IHello<String> {
public void sayHello(String s) {
System.out.println("hello "+s);
}
public void sayHello(Object s) {
sayHello((String)s);
}
}
这里的
public void sayHello(Object s) {
sayHello((String)s);
}
就是所谓的桥接方法。通过这个方法,能够让虚拟机识别普通方法,而在代码层面实现了泛型的效果。