黑马程序员技术交流社区
标题:
用反射把Integer放入List<String>中,取数据时报错,这是为什么?
[打印本页]
作者:
张校云
时间:
2011-10-2 17:13
标题:
用反射把Integer放入List<String>中,取数据时报错,这是为什么?
用反射把String字符串放入List<Integer>中可以正确取出,但是用反射把Integer放入List<String>中,取数据时报错,这是为什么?
代码如下:[code=java]package day2;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class GenericTest {
public static void main(String[] args) throws Exception{
List<Integer> list = new ArrayList<Integer>();
Method method = List.class.getMethod("add", Object.class);
method.invoke(list, "111");
System.out.println(list.get(0));
List<String> list1 = new ArrayList<String>();
method.invoke(list1, new Integer(111));
System.out.println(list1.get(0));
}
}[/code]
作者:
匿名
时间:
2011-10-2 21:39
确实是啊 为什么呢?来个人解答下啊.....
作者:
匿名
时间:
2011-10-2 22:12
把这句System.out.println(list1.get(0)); 换成
Object obj=list1.get(0);
System.out.println(obj);
就不会出错了。
往String类型集合中存入Integer类型数据后,取出时将它们转换成公有的Object类
原因:执行System.out.println(list.get(0));时内部调用了String.valueof(obj)方法,
而执行System.out.println(list1.get(0));这句时,由于List指定的是String类型,它便直接输出了,因此报错java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
作者:
匿名
时间:
2011-10-3 12:59
明白了 ,谢谢
作者:
匿名
时间:
2011-10-3 17:47
标题:
回复 藤椅 的帖子
当List<Integer>
method.invoke(list, "111");
存入一个String都可以
当List<String>
method.invoke(list1, new Integer(111));
存入一个Integer就不行
还得请教
可不明白就是
定义集合时的参数类型和存入的数据类型以及取出来的数据类型
它们之间都是什么关系
作者:
匿名
时间:
2011-10-4 12:24
不好意思,之前没发现我第二个回复叫 藤椅,所以就略过了
其实泛型只是做给编译器看的,
ArrayList<String> collection1 = new ArrayList<String>();
ArrayList<Integer> collection2 = new ArrayList<Integer>();
System.out.println(collection1.getClass() == collection3.getClass());//这里不是输出true的吗!
所以编译完后,泛型类型就不起作用了,
利用反射是可以存入不同类型数据的,就是取出时会出现问题,
所以取出时最好先进行类型转换,转成公有数据类型,再输出。
作者:
匿名
时间:
2011-10-4 12:54
标题:
回复 地板 的帖子
反射时不存在类型参数
存什么类型都可以
取出时需要转型
明白了 谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2