黑马程序员技术交流社区

标题: 利用反射给泛型类型添加其他类型的值 [打印本页]

作者: 一年之后    时间: 2013-12-28 22:18
标题: 利用反射给泛型类型添加其他类型的值
  1. <p>第一种情况可以编译通过。打印abc
  2. package cn.heima.day02;

  3. import java.util.ArrayList;
  4. import java.util.Collection;

  5. public class GeneriTest {

  6.         public static void main(String[] args)throws Exception{
  7.                 ArrayList<Integer> coll = new ArrayList<Integer>() ;
  8.                 coll.add(1) ;
  9.                 coll.add(2) ;
  10.                 coll.getClass().getMethod("add",Object.class).invoke(coll,"abc") ;
  11.                 System.out.println(coll.get(2)) ;
  12.         }
  13. }</p><p>
  14. 第二种情况就类型转换异常,为什么这样?
  15. package cn.heima.day02;

  16. import java.util.ArrayList;
  17. import java.util.Collection;

  18. public class GeneriTest {

  19.         public static void main(String[] args)throws Exception{
  20.                 ArrayList<String> coll = new ArrayList<String>() ;
  21.                 coll.add("abc") ;
  22.                 coll.add("bcd") ;
  23.                 coll.getClass().getMethod("add",Object.class).invoke(coll,1) ;
  24.                 System.out.println(coll.get(2)) ;
  25.         }
  26. }
  27. </p>
复制代码


作者: doitforyou    时间: 2013-12-29 09:37
我试了下,只要泛型设定的是基本类型的引用类型,如Integer、Character等等,通过反射添加其他元素再进行都不会有转换异常,但是如果泛型设定的是引用类型,则会有转换异常。
这个原因我不是很清楚,你知道的话告诉我下,谢谢了。
但是你如果通过反射得到的不是方法,而是得到一个新的集合,那么你就可以添加任意类型了。
使用的时候注意下就好了。
作者: tuanjie    时间: 2013-12-29 09:54
ArrayList<String> coll = new ArrayList<String>() ;你限制ArrayList集合里面只能存放String类型的数据, coll.getClass().getMethod("add",Object.class).invoke(coll,1) ;这句代码通过反射调用ArrayList集合里面的add方法为集合添加数据,你添加的是int类型,即使int类型自动装箱为Integer类型,也无法自动转换为String类型,就会出现异常转换问题了




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