Bridge Method

1.java编译器采用Bridge Method 来兼容本该使用泛型的地方使用了非泛型的问题。

public class TestBridgeMethod {
    public static void main(String[] args) {
        //p引用的是S的对象,但S的test方法返回值是String
        //在jdk1.4中没有泛型,对p.test(new Object())进行检查会报ClassCastException
        //声明p的时候使用P<String> p就不会有这样的问题了。
        P p = new S();    
        p.test(new Object());
    }
}

class P<T> {
    public T test (T t){
        return t;
    }
}

class S extends P<String> {
    @Override
    public String test(String t) {
        return t;
    }
}

2.

 public static void main(String[] args) {  
        Class<?> clazz = S.class;  
        Method[] methods = clazz.getMethods();  
        for(Method method : methods) {  
            System.out.println(method.getName() + ":" + Arrays.toString(method.getParameterTypes()) + method.isBridge());  
        }  
    }  

结果:

test:[class java.lang.String]  false
test:[class java.lang.Object]  true
getClass:[]  false
hashCode:[]  false
equals:[class java.lang.Object]   false
toString:[]  false
notify:[]  false
notifyAll:[]  false
wait:[long, int]  false
wait:[]  false
wait:[long]  false

编译器为S生成了两个test方法:

一个参数为String,用于泛型

一个参数为Object,用于非泛型,这个方法就是bridge方法,调用method.isBridge返回true

posted @ 2014-07-13 12:00  等风来。。  Views(282)  Comments(0Edit  收藏  举报
------------------------------------------------------------------------------------------------------------ --------------- 欢迎联系 x.guan.ling@gmail.com--------------- ------------------------------------------------------------------------------------------------------------