黑马程序员技术交流社区

标题: 使用反射给已定泛型集合添加其他类型元素的问题 [打印本页]

作者: 黑马潘浩    时间: 2013-3-27 11:29
标题: 使用反射给已定泛型集合添加其他类型元素的问题
本帖最后由 黑马潘浩 于 2013-3-28 15:27 编辑
  1. import java.util.ArrayList;
  2. import java.util.List;


  3. public class Demo {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) throws Exception{
  8. //第一种
  9.                 List<String> list = new ArrayList<String>();               

  10.                 list.getClass().getMethod("add", Object.class).invoke(list,1);   
  11.                 System.out.println(String.valueOf(list.get(0)));//为什么这里要调用String.valueOf()方法。



  12. //第二种
  13.                 List<Integer> list2 = new ArrayList<Integer>();               

  14.                 list2.getClass().getMethod("add", Object.class).invoke(list2,"abc");  
  15.                 System.out.println(list2.get(0));//这可以直接取出元素
  16.                

  17.         }

  18. }
复制代码
如上面的代码,在第一个泛型为String的list的集合中,为该集合添加一个Integer对象,而在取出该对象的时候为什么要调用String.valueOf()方法才能取出,不然就会报错。
而第一个泛型为Integer的list2的集合中,为该集合添加一个String对象,取出时不需要调用任何方法就可以直接打印。问这两者之间的区别?

作者: itserious    时间: 2013-3-27 12:35

                // 第一种
                List<String> list = new ArrayList<String>();
               
                //你下面传的参数类型为Object.你传的int 类型的1,会自动装箱成Integer
                list.getClass().getMethod("add", Object.class).invoke(list, 1);
               
               
                System.out.println(String.valueOf(list.get(0)));// 为什么这里要调用String.valueOf()方法。
                //上面要加String.valueOf(),是因为,list.get(0)会返回一个Integer类型的对象
                //你想打印它,你就必须将它转换成字符串,String String.valueOf(Integer inte),
                //这样才可以调用toString 方法打印它
               
               
               
                // 第二种
                List<Integer> list2 = new ArrayList<Integer>();
               
                //你下面传的参数类型为Object.你传的"abc" ,是字符串,已经是对象了。
                list2.getClass().getMethod("add", Object.class).invoke(list2, "abc");
                System.out.println(list2.get(0));// 这可以直接取出元素
                //上面list2.get(0)的返回值是字符串。所以可以直接调用toString()方法打印。
作者: 黑马潘浩    时间: 2013-3-27 12:42
itserious 发表于 2013-3-27 12:35
// 第一种
                List list = new ArrayList();
               

在第一种的方式中,它为什么一定要转成字符串才能打印呢?这个才是问题的关键。而且Integer对象也是可以直接打印的如以下代码
  1. import java.util.ArrayList;
  2. import java.util.List;




  3. public class Demo {

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

  8.                  List<Integer> list2 = new ArrayList<Integer>();
  9.                  list2.add(1);
  10.                  System.out.println(list2.get(0));
  11.         }
  12. }
复制代码
既然Integer对象可以直接打印,这里又为什么一定要转成字符串才能打印呢?




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