`
LY_NullPoint
  • 浏览: 2069 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java泛型的一个陷阱

阅读更多
java泛型检查只在编译期有效,而反射是在运行期的调用机制。

比如下面这个例子:
Map<String, String> map = new HashMap<String, String>();
        String key = "key";
        Integer val = new Integer(1);
        Method m = HashMap.class.getDeclaredMethod("put", new Class[] { Object.class, Object.class });
        m.invoke(map, key, val);

        System.out.println(map); //{key=1}
        System.out.println(map.get(key)); // java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    }


用反射进行put,绕过了泛型检查;get时泛型会自动进行类型转换,从而导致了ClassCastException。
1
3
分享到:
评论
6 楼 LY_NullPoint 2014-03-06  
鬼大来晚了 写道
不明白为什么要这么搞。就是为了证明泛型的这个缺陷?


我遇到的情况是一个类的方法参数是泛型Map, 被调用时的参数是框架使用反射生成的, 由于例子里的原因, 无法对map进行get操作, 报ClassCastException.
5 楼 yelangking 2014-02-28  
应该说泛型是一种约定规范,而反射是可以在运行时改变一个类的属性,与规范没有冲突,算不上陷阱吧!呵呵,本人拙见。
4 楼 ansjsun 2014-02-27  
java 泛型是强转实现的。。。你这么作 无非调用一个对象invoke 方法 。随便传都可以。。反正你要的就是类转换异常。和泛型半毛钱关系没有
3 楼 hekuilove 2014-02-27  
有价值吗?
2 楼 鬼大来晚了 2014-02-27  
不明白为什么要这么搞。就是为了证明泛型的这个缺陷?
1 楼 cooncut 2014-02-27  
字节码里面的泛型信息已经被擦出了,只在编译时刻才有泛型信息,java的泛型就这熊样

相关推荐

Global site tag (gtag.js) - Google Analytics