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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陪你等日出 中级黑马   /  2014-3-1 13:08  /  1061 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

用反射的方法透过编译器向泛型限定为Integer类型的集合中添加String类型的值时
ArrayList<Integer> list = new ArrayList<Integer>();
  list.getClass().getMethod("add", Object.class).invoke(list, "abc");
  System.out.println(list.get(0));
这样可以;

ArrayList<Integer> list = new ArrayList<Integer>();
  list.getClass().getMethod("add", String.class).invoke(list, "abc");
  System.out.println(list.get(0));
这样为什么不可以,getMethod()方法的第二个参数不是代表要获取的方法的参数类型吗?那怎么不能
写String.class了?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

4 个回复

倒序浏览
因为 add 方法的参数是可以接收任何类型的,在 JDK 1.5之前 其形参类型就是用 Object 表示的,写Strig.class自然找不到方法。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
getMethod()方法获得的是ArrayList中的方法,在ArrayList中,没有add(String str)这个方法啊。
在泛型出现之前,是add(Object obj),在泛型出现之后,是add(E e)。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
volvoxc 发表于 2014-3-1 14:02
getMethod()方法获得的是ArrayList中的方法,在ArrayList中,没有add(String str)这个方法啊。
在泛型出现 ...

理解了,我一直以为这个参数是后面实际调用方法时存入的参数类型,谢谢你!
回复 使用道具 举报
李白衣 发表于 2014-3-1 13:23
因为 add 方法的参数是可以接收任何类型的,在 JDK 1.5之前 其形参类型就是用 Object 表示的,写Strig.clas ...

理解了,我一直以为这个参数是后面实际调用方法时存入的参数类型,谢谢你!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马