参考:http://freish.iteye.com/blog/1158008
java编译器采用bridge方法来兼容本该使用泛型的地方使用了非泛型的用法的问题。
如下代码:
- public class TestBridgeMethod {
- public static void main(String[] args) {
- 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;
- }
- }
p引用的是S的对象,但S的test方法返回值是String,在jdk1.4中没有泛型,就不会对p.test(new Object());进行检查,这样在调用的时候就会报ClassCastException
声明p的时候使用P<String> p就不会有这样的问题了。
为了兼容非泛型的代码,java编译器为test生成了两个方法。看下面的代码:
- import java.lang.reflect.Method;
- import java.util.Arrays;
- public class TestBridgeMethod {
- 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());
- }
- }
- }
- class P<T> {
- public T test (T t){
- return t;
- }
- }
- class S extends P<String> {
- @Override
- public String test(String t) {
- return t;
- }
- }
运行结果为:
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