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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

反射把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));
        }
}

2 个回复

倒序浏览
这句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
回复 使用道具 举报
像楼上这写: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;
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马