zoukankan      html  css  js  c++  java
  • 什么是Method.isBridge方法

    参考:http://freish.iteye.com/blog/1158008

    java编译器采用bridge方法来兼容本该使用泛型的地方使用了非泛型的用法的问题。

    如下代码:

    Java代码  收藏代码
    1. public class TestBridgeMethod {  
    2.     public static void main(String[] args) {  
    3.         P p = new S();  
    4.         p.test(new Object());  
    5.     }  
    6. }  
    7.   
    8. class P<T> {  
    9.     public T test (T t){  
    10.         return t;  
    11.     }  
    12. }  
    13.   
    14. class S extends P<String> {  
    15.     @Override  
    16.     public String test(String t) {  
    17.         return t;  
    18.     }  
    19. }  

    p引用的是S的对象,但S的test方法返回值是String,在jdk1.4中没有泛型,就不会对p.test(new Object());进行检查,这样在调用的时候就会报ClassCastException

    声明p的时候使用P<String> p就不会有这样的问题了。

    为了兼容非泛型的代码,java编译器为test生成了两个方法。看下面的代码:

    Java代码  收藏代码
    1. import java.lang.reflect.Method;  
    2. import java.util.Arrays;  
    3.   
    4.   
    5. public class TestBridgeMethod {  
    6.     public static void main(String[] args) {  
    7.         Class<?> clazz = S.class;  
    8.         Method[] methods = clazz.getMethods();  
    9.         for(Method method : methods) {  
    10.             System.out.println(method.getName() + ":" + Arrays.toString(method.getParameterTypes()) + method.isBridge());  
    11.         }  
    12.     }  
    13. }  
    14.   
    15. class P<T> {  
    16.     public T test (T t){  
    17.         return t;  
    18.     }  
    19. }  
    20.   
    21. class S extends P<String> {  
    22.     @Override  
    23.     public String test(String t) {  
    24.         return t;  
    25.     }  
    26. }  

    运行结果为:

    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

  • 相关阅读:
    问题:https与http有什么区别啊?
    Android应用开发是否应避免使用枚举?
    AppStore 内购验证的方法
    vs2017环境下编译log4cpp-1.1.3
    iphone开发笔记
    系统界面跳转设置[转]
    常用宏OC
    git忽略文件
    第三方开源库学习
    [转]iOS开发总结之代码规范
  • 原文地址:https://www.cnblogs.com/wjw334/p/4375618.html
Copyright © 2011-2022 走看看