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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李阳阳 中级黑马   /  2013-5-19 20:16  /  2721 人查看  /  22 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李阳阳 于 2013-5-20 12:02 编辑

ArrayList<Integer> collection1 = new ArrayList<Integer>();               
collection1.getClass().getMethod("add", Object.class).invoke(collection1,"abc");
System.out.println(collection1.get(0));

上面这样可以下面这样怎么就不行了呢?
ArrayList<String> collection2 = new ArrayList<String>();
collection2.getClass().getMethod("add", Object.class).invoke(collection2,1);
System.out.println(collection2.get(0));

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

22 个回复

倒序浏览
我是来看头像的,楼主好帅好猛。。

楼下继续 此楼忽略。。。
回复 使用道具 举报
collection3是哪来的。可否把全部代码列出来。
回复 使用道具 举报
黑马伍哲沂 发表于 2013-5-19 20:35
collection3是哪来的。可否把全部代码列出来。

改过来了,复制的时候搞错了、、
回复 使用道具 举报
  1. ArrayList<String> collection2= new ArrayList<String>();
  2. ArrayList<String> collection2= new ArrayList<String>();
  3.                 collection2.getClass().getMethod("add", Object.class).invoke(collection2,"a");
  4.                 System.out.println(collection2.get(0));
复制代码
改为这样,类型要匹配
回复 使用道具 举报
乘鱼飞 发表于 2013-5-19 20:46
改为这样,类型要匹配

用反射的话不是不需要考虑那些吗、
回复 使用道具 举报
李阳阳 发表于 2013-5-19 20:54
用反射的话不是不需要考虑那些吗、

集合的元素类型是给编辑器看的。Vector<Stirng> v = new Vector<String>();
和Vector<Integer> v1 = new Vector<Integer>();
v.getclass() 和V1.getClass();是同一份字节码。
在JDK1.5以前,我们是可以随便往集合中添加各种元素的。JDK1.5 估计是没有个改变1.5以前版本的底层代码。所以才导致,通过反射可以添加不同类型的元素。
楼主是否可以结贴了。哈哈

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马伍哲沂 于 2013-5-19 21:16 编辑
李阳阳 发表于 2013-5-19 20:39
改过来了,复制的时候搞错了、、

啊。楼上正解。学习了。
回复 使用道具 举报
本帖最后由 黑马伍哲沂 于 2013-5-19 21:44 编辑

仔细看了下,还是不对。
我做了些实验,小结在代码注释中。
  1. //                只要参数化泛型类型时,不是String。貌似就可以运行时添加和取出任意类型。
  2.                 ArrayList<Integer> collection1 = new ArrayList<Integer>();               
  3.                 collection1.getClass().getMethod("add", Object.class).invoke(collection1,new Date());
  4.                 System.out.println(collection1.get(0));

  5.                 ArrayList<Date> collection3 = new ArrayList<Date>();               
  6.                 collection3.getClass().getMethod("add", Object.class).invoke(collection3,"hello");
  7.                 collection3.getClass().getMethod("add", Object.class).invoke(collection3,17);
  8.                 System.out.println(collection3.get(0)+":"+collection3.get(1));

  9. //                当参数化泛型类型为String时,运行时能添加任意类型,但取出时出现类型转换异常
  10.                 ArrayList<String> collection2 = new ArrayList<String>();
  11.                 Object obj = collection2.getClass().getMethod("add", Object.class).invoke(collection2, 12);
  12.                 Object obj1 = collection2.getClass().getMethod("add", Object.class).invoke(collection2, new Date());
  13. //                返回两个true,说明都添加成功。
  14.                 System.out.println(obj+":"+obj1);
  15. //                是在取出的时候出问题。
  16.                 System.out.println(collection2.get(0)+":"+collection2.get(1));
复制代码
最终总结,求高手。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 袁梦希 于 2013-5-19 21:54 编辑

楼主你好:
其实我看其他楼层回答的我也不懂,我就用大白话说了。
其实我来说说这是怎么回事,因为集合中可以装任意引用类型数据,
而不能装基本数据类型,所以获取的时候也不能获取基本数据类型的数据,
因为你第一个获取的是字符串类型的,而第二个获取的却是基本数据类型的,
因为你添加元素添加个1,因为1是基本数据类型,所以必须自动装箱成Integer引用类型
的数据才能添加进去,当获取他的时候需要自动拆箱,又拆回了基本数据类型,
所以你用get(0)获取的时候是基本数据类型的,所以不对了。

————————菜鸟云青年为您手动解答,如果我说的不对,你就顶我的肺。我都被我团员们顶死了

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
袁梦希 发表于 2013-5-19 21:44
ArrayList collection1 = new ArrayList();               
collection1.getClass().getMethod("add", Obj ...

貌似也是不对啊,看我上面第14行代码,我添加Date对象,貌似也取不出来。
回复 使用道具 举报
黑马伍哲沂 发表于 2013-5-19 21:50
貌似也是不对啊,看我上面第14行代码,我添加Date对象,貌似也取不出来。 ...

        ArrayList<String> collection4 = new ArrayList<String>();
        collection4.getClass().getMethod("add", Object.class).invoke(collection4,1);
        System.out.println(collection4.size());//集合里面有元素
        //System.out.println(collection4.get(0));
        for(int n=0;i<collection4.size();n++)
        {
                System.out.println(collection4.get(0));//貌似这样能取出来但是用高级for好像不行哎
        }
回复 使用道具 举报
李阳阳 发表于 2013-5-19 22:29
ArrayList collection4 = new ArrayList();
        collection4.getClass().getMethod("add", Object.c ...

这个问题以前我弄过,我是这样记的,查看集合可以查看,就是不能获取,以前我是这么记得。
回复 使用道具 举报
李阳阳 发表于 2013-5-19 22:29
ArrayList collection4 = new ArrayList();
        collection4.getClass().getMethod("add", Object.c ...

高级 for没试,我试过迭代器,没有问题 。总之,就是可以加入,但是用get取出就有问题。而且只有泛型参数化为String时有这种问题 。
回复 使用道具 举报
袁梦希 发表于 2013-5-19 21:44
楼主你好:
其实我看其他楼层回答的我也不懂,我就用大白话说了。
其实我来说说这是怎么回事,因为集合中可 ...

      
ArrayList al = new ArrayList();
        al.add(1);//自动装箱
        al.add(2);
        al.add(3);
        System.out.println(al.get(0));//自动拆箱   你的意思是这个地方吗?
回复 使用道具 举报
李阳阳 发表于 2013-5-19 22:41
ArrayList al = new ArrayList();
        al.add(1);//自动装箱
        al.add(2);

我刚才答的有点误差,
回复 使用道具 举报
李阳阳 发表于 2013-5-19 22:41
ArrayList al = new ArrayList();
        al.add(1);//自动装箱
        al.add(2);

不行了  找个大神吧   我是不会了   哈哈哈
回复 使用道具 举报
正在总结泛型部分。其实泛型要掌握到怎样的程度?我也在思考这个问题。
看书去了。
回复 使用道具 举报
本帖最后由 Super_Class 于 2013-5-20 11:44 编辑

原因是1是基本数据类型。jdk1.5以后会自动装箱,将基本数据类型装箱为
new Integer(1);
System.out.println(collection2.get(0)); //这个地方将集合中的元素[1]直接拆箱了。但是正因为是直接拆箱,从一个包装类对象编程了基本数据类型。就没有办法调用toString方法了。(一般数据类型没有这个方法)。所以就需要用方法进行转换了
可以用以下方法:
System.out.println(String.valueOf(collection2.get(0)));

回复 使用道具 举报
Super_Class 发表于 2013-5-20 08:33
原因是1是基本数据类型。jdk1.5以后会自动装箱,将基本数据类型装箱为
new Integer(1);
System.out.println ...

你的意思是collection2.get(0)返回值的类型是基本数据类型int型,但是基本数据类型没有toString()方法,
而要打印的话必须有要toString方法,所以打印不出来是吗、
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马