黑马程序员技术交流社区

标题: 反射穿透泛型时遇见的一个问题(类型转换异常) [打印本页]

作者: HM朱蛟    时间: 2013-5-23 16:23
标题: 反射穿透泛型时遇见的一个问题(类型转换异常)
本帖最后由 HM朱蛟 于 2013-5-25 15:22 编辑

老师的例子结果没问题:

package cn.itcast.day2;
import java.util.*;
public class GenericDemo {
/**
  * @param args
  */
public static void main(String[] args)throws Exception {
  ArrayList<Integer> collection = new ArrayList<Integer>();
  //collection.add(1);//集合泛型限定是Integer然而我却想通过反射的方式给他add一个字符串
  collection.getClass().getMethod("add", Object.class).invoke(collection,"abc");
  collection.add(2);
  System.out.println(collection.get(0)+" and "+collection.get(1));
}
}

输出结果:
abc and 2


我把泛型限定类型改了下,Integer改成String然后反射进一个Integer,同样的操作方式这里要抛出异常,类型转换失败。
  1. package cn.itcast.day2;

  2. import java.util.*;

  3. public class GenericDemo {

  4. /**
  5. * @param args
  6. */
  7. public static void main(String[] args)throws Exception {

  8. ArrayList<String> collection = new ArrayList<String>();
  9. //collection.add(1);//集合泛型限定是String然而我却想通过反射的方式给他add一个整数
  10. collection.getClass().getMethod("add", Object.class).invoke(collection,new Integer(1));
  11. //collection.add("abc");
  12. System.out.println(collection.get(0)+" and "+collection.get(1));
  13. }
  14. }
复制代码
运行结果:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at cn.itcast.day2.GenericDemo.main(GenericDemo.java:16)




作者: 王永贺    时间: 2013-5-23 17:08
本帖最后由 王永贺 于 2013-5-23 17:20 编辑
  1. package cn.itcast.day2;

  2. import java.util.*;

  3. public class GenericDemo {
  4. //同样利用反射的方法获取值。。。。

  5. public static void main(String[] args)throws Exception {

  6. ArrayList<String> collection = new ArrayList<String>();
  7. //collection.add(1);//集合泛型限定是String然而我却想通过反射的方式给他add一个整数
  8. collection.getClass().getMethod("add", Object.class).invoke(collection,new Integer(1));
  9. collection.add("abc");
  10. Object obj=collection.getClass().getMethod("get", int.class).invoke(collection,0);
  11. System.out.println(obj+" and "+collection.get(1));
  12. }
  13. }
复制代码

作者: eycrckag    时间: 2013-5-23 18:15
不能强制转换。。。。。
作者: 袁梦希    时间: 2013-5-24 01:18
eycrckag 发表于 2013-5-23 18:15
不能强制转换。。。。。

哥们你头像很给力
作者: 袁梦希    时间: 2013-5-24 01:18
楼主你好,如果问题以解决,请修改分类,谢谢合作。

作者: 不胖的胖子    时间: 2013-5-24 06:11
袁梦希 发表于 2013-5-24 01:18
楼主你好,如果问题以解决,请修改分类,谢谢合作。

这个我昨晚做了对比测试的,一直想找到问题的根源。
虽然我们都知道是类型转换出了问题。
编译器给出了出错行,我也把类型提升到Object,得到了想要的结果。
但是,为什么用Integer接收String可以,反过来用Integer接收了String在输出
时却会报错?
我觉得这才是问题的关键。目前还在寻找中。昨天太累,没搞出来。
这个问题是我第二次看见了。
作者: 刘胜寒    时间: 2013-5-24 07:41
不胖的胖子 发表于 2013-5-24 06:11
这个我昨晚做了对比测试的,一直想找到问题的根源。
虽然我们都知道是类型转换出了问题。
编译器给出了出 ...

我也在想这个问题
作者: HM朱蛟    时间: 2013-5-24 13:34
不胖的胖子 发表于 2013-5-24 06:11
这个我昨晚做了对比测试的,一直想找到问题的根源。
虽然我们都知道是类型转换出了问题。
编译器给出了出 ...

对 就是这个意思。。。  
作者: 何俊森    时间: 2013-5-24 17:49
本帖最后由 何俊森 于 2013-5-24 18:05 编辑
王永贺 发表于 2013-5-23 17:08

你好,能说说你这里为什么要用反射取那个Integer吗?
不用反射也可以的啊

  1.                 ArrayList<String> collection = new ArrayList<String>();
  2.                 collection.getClass().getMethod("add", Object.class).invoke(collection,new Integer(1));
  3.                 collection.add("abc");
  4.                 Object obj=collection.get(0);
  5.                 System.out.println(obj+" and "+collection.get(1));
复制代码

作者: HM朱蛟    时间: 2013-5-25 10:17
何俊森 发表于 2013-5-24 17:49
你好,能说说你这里为什么要用反射取那个Integer吗?
不用反射也可以的啊 ...

只是个小实验啊  没有啥为什么啊  就是跟着老师做的练习  然后自己改了下参数  结果报异常  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2