黑马程序员技术交流社区

标题: 对泛型用反射时 [打印本页]

作者: lkjghvcx@163.co    时间: 2013-7-30 08:27
标题: 对泛型用反射时
本帖最后由 lkjghvcx@163.co 于 2013-7-30 09:56 编辑

ArrayList<Integer> list=new ArrayList<Integer>();
Method method=list.getClass().getMethod("add",Object.class);
String str= "添加字符串!";                 //创建字符串
method.invoke(list, str);    //在list上调用add方法,用反射技术

ArrayList<String> list=new ArrayList<String>();
Method method=list.getClass().getMethod("add",Object.class);
Integer i= new Integer(5);               
method.invoke(list, i);    //在list上调用add方法,用反射技术

为何上面的可以,下面的不可以
java.lang.Integer cannot be cast to java.lang.String

取出时有问题 list.get()
第一个取时没问题
下面的有问题




作者: 哪颗最亮的星星    时间: 2013-7-30 08:45
兄弟代码没总题啊,可以说,泛型只是编译时的限定,你的JRE是什么版本呢1.6以上就不会出问题的
作者: taomingking    时间: 2013-7-30 08:46
你好,根据你说的情况,我测试了你给的代码,两种情况都是可以的,因为java中的泛型只是在编译时期有效,通过反射得到的方法并没有泛型限定的,所以上下两种情况都是可以的
作者: lkjghvcx@163.co    时间: 2013-7-30 09:20
哪颗最亮的星星 发表于 2013-7-30 08:45
兄弟代码没总题啊,可以说,泛型只是编译时的限定,你的JRE是什么版本呢1.6以上就不会出问题的 ...

取出时有问题 list.get()
作者: lkjghvcx@163.co    时间: 2013-7-30 09:20
taomingking 发表于 2013-7-30 08:46
你好,根据你说的情况,我测试了你给的代码,两种情况都是可以的,因为java中的泛型只是在编译时期有效,通过反 ...

取出时有问题 list.get()
第一个取时没问题
下面的有问题
作者: 哪颗最亮的星星    时间: 2013-7-30 09:40
lkjghvcx@163.co 发表于 2013-7-30 09:20
取出时有问题 list.get()

System.out.println((Object)list.get(0));
这样就没问题了
作者: 哪颗最亮的星星    时间: 2013-7-30 09:43
for(Iterator it=list.iterator();it.hasNext();)
                {
                        System.out.println((Object)it.next());
                }

这样取也行的
作者: lkjghvcx@163.co    时间: 2013-7-30 09:56
哪颗最亮的星星 发表于 2013-7-30 09:43
for(Iterator it=list.iterator();it.hasNext();)
                {
                        System.out.println((Object)it.next());

原来是这样,谢谢!
作者: lkjghvcx@163.co    时间: 2013-7-30 10:00
哪颗最亮的星星 发表于 2013-7-30 09:43
for(Iterator it=list.iterator();it.hasNext();)
                {
                        System.out.println((Object)it.next());

那为何上面的那个不用转(Object)
作者: 哪颗最亮的星星    时间: 2013-7-30 15:25
lkjghvcx@163.co 发表于 2013-7-30 10:00
那为何上面的那个不用转(Object)

String和String是新兄弟,它们一个妈,当然不用转,Integer和String它们虽然也是兄弟,但不一个妈,Object是它们共同的爹,所以用Object就OK




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