黑马程序员技术交流社区

标题: 用反射把Integer放入List<String>中,取数据时报错,这是为什么? [打印本页]

作者: 张文兵    时间: 2012-6-13 14:26
标题: 用反射把Integer放入List<String>中,取数据时报错,这是为什么?
反射把String字符串放入List<Integer>中可以正确取出,但是用反射把Integer放入List<String>中,取数据时报错,这是为什么?
代码如下:;
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));
        }
}

作者: 江南    时间: 2012-6-13 14:27
这句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
作者: 郑传庆    时间: 2012-6-13 14:45
像楼上这写:Object obj=list1.get(0);也可以,你也可以自己写一个泛型的转换,自动将Object类型的对象转换成其它类型的对象。就像下面这个也可以得到一样的结果
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));
        Object obj = (Object)list1.get(0);
        System.out.println(get(list1.get(0)));
        }
        public static <T>T get(Object obj){//自动将Object类型的对象转换成其它类型的对象
                return (T)obj;
        }





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