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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 抽烟男孩 中级黑马   /  2013-9-10 07:59  /  1073 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 抽烟男孩 于 2013-9-12 13:38 编辑

  1. <P>//通过反射给Integer泛型的ArrayList型集合list中添加String型变量“abc”。
  2. public static void main(String[] args) throws Exception
  3. {
  4. ArrayList<Integer> list = new ArrayList<Integer>();
  5. list.add(3);
  6. //通过反射添加“abc”
  7. list.getClass().getMethod("add", Object.class).invoke(list, "abc");
  8. System.out.println(list.get(0));//输出3,没问题</P>
  9. <P>/*为什么以下语句没有问题*/
  10. System.out.println(list.get(1));//输出“abc”,没问题
  11. System.out.println(list.get(0).getClass());//输出3的类名没问题
  12. /*为什么以下语句有问题*/
  13. System.out.println(list.get(1).getClass());//输出“abc”的类名有问题
  14. }</P>
复制代码
对比以下代码
  1. //通过反射给String泛型的ArrayList型集合list中添加Integer型变量3。
  2. public static void main(String[] args) throws Exception
  3. {
  4. ArrayList<String> list = new ArrayList<String>();
  5. list.add("abc");
  6. //通过反射添加3
  7. list.getClass().getMethod("add", Object.class).invoke(list, new Integer(3));
  8. System.out.println(list.get(0));//输出"abc",没问题

  9. /*为什么以下语句有问题*/
  10. System.out.println(list.get(1));//输出3,有问题
  11. System.out.println(list.get(0).getClass());//输出“abc”的类名没问题
  12. /*为什么以下语句有问题*/
  13. System.out.println(list.get(1).getClass());//输出3的类名有问题
  14. }

复制代码

2 个回复

正序浏览
编译时候 如果有重载方法的调用,编译器要确定运行时候的到底调用哪一个重载方法

你现在ArrayList限定为<Integer> 这样  编译到最后一行的时候,会直接调用public void println(Object obj);
调用这个重载的原因是:编译的时候,ArrayList<Integer>的get方法返回的是Integer类型的数据
【注意  泛型信息是在编译完成之后被擦出的  编译的过程中是非常有用的】
【如果你不信  你就使用ctrl+左键  点击 println这个位置  就会自动跳到 PrintStream类的public void println(Object obj) 而不是其他的println重载方法】
所以  编译到最后一行的时候  get方法应该返回Integer类型的值,调用的就是println(Object obj) 但是你通过反射操作集合后存入的元素是String类型,当你再调用getClass()方法时JVM会尝试将String类型转换为Integer类型,但是转换不可行所以抛出异常
问题的根源就在于:
编译的时候,根据编译得到的实际参数【有泛型信息在里面】的类型来决定重载方法的调用 ---- 其一
println(String)和println(Object)同样接收数据  一个传入的是Integer 强转到String会报异常   另一个是String转换到Object  没有问题  。 -----其二

回复 使用道具 举报 1 0
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马