A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾振凯 中级黑马   /  2013-3-27 23:54  /  1698 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. List<Integer> list = new ArrayList<Integer>();
  2. list.getClass().getMethod("add", Object.class).invoke(list,"abc");
  3. System.out.println(list.get(0));
复制代码
话说使用了泛型以后返回值类型是确定的,所以不用强转,

反射越过的屏障是编译器,但是list.get()不是用的反射

也就是说list.get(0)是知道返回的是Integer类型的,,,为毛最后还是可以成功打印abc

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

1 个回复

倒序浏览
因为你用的是反射的方式去获得 List接口里面的dd方法, 把你的这段翻译一下就是这样
反射掉用list这个类的add方法新增一个值“abc”,这段代码里没有调用泛行
反射是去调用对象的低沉原类 而List这个类本身的泛型是空 他直接调用这个空的泛型了,除非你改写这个类 不然没用
你可以调用 Class里面的【 getAnnotation(Class<A> annotationClass) ;如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。】
这个方法 看看有没有泛型

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马