反射与泛型擦除

一般来讲,Java集合接口类似于List,Set等接口,在声明定义或者往其中第一次添加元素后,往其中添加的类型是不能改变的(Objdect类除外),实例如下:

 

public class Demo {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList();
        list.add(123);
        list.add("258");
        for (Object o : list) {
            System.out.println(o);
        }
    }
}

     此时运行程序会抛出异常:Integer和String参数类型不匹配,那么如何使list中能够添加String类型呢?

实际上查看ArrayList实现,其存储元素的方式是一个Object数组,取出时通过强制转换实现,

 

    transient Object[] elementData; // non-private to simplify nested class access

 

这时可以通过反射实现添加不同类型的元素,方法和结果如下:

public class Demo {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        List<Integer> list = new ArrayList();
        list.add(123);
        Method method = list.getClass().getMethod("add",Object.class);//不用Object同样会报错
        method.invoke(list,"添加了字符串");
        for(Object o:list){
            System.out.println(o);
        }
    }

}
——————————————————————————————————————————————————
123
添加了字符串

Process finished with exit code 0

  

posted @ 2021-01-28 16:16  Youfail  阅读(142)  评论(0编辑  收藏  举报