理解泛型擦除,及反射的应用

需求描述:

需要往List类型的集合中添加Integer或Long或其他类型的数据。如何实现这个需求呢?

分析:理解泛型擦除,反射的应用

泛型擦除,先看下List类的源码,public interface List<E> extends Collection<E> {},可以看到List中用到了泛型。所谓的泛型擦除,即泛型的检查是发生在编译期,而经过编译后生成.class文件中是显式地指定了List的类型为某一类型(如果不加泛型,那该集合可以存储任意类型)。例如,.java文件中有一段代码是List list = new ArrayList<>();在编译期,往该list集合add进某个元素,是要做类型检查的,检查该元素是否为指定的泛型。而经过编译期后,就没有泛型的存在了,就像平时定义的集合一样,就是一个List,而不是List。这个现象就是我理解的泛型擦除。

解决:回归到需求,如何往List类型的集合中添加Integer类型的数据呢?其实就是要越过泛型的数据类型检查,也就是越过编译器的类型检查,到了运行期,通过反射的方式往List中add其他类型的元素。

代码如下:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Type {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        List<String> list =new ArrayList<>();
        list.add("abc");
        Class<? extends List> c = list.getClass();
        Method method=c.getMethod("add",Object.class);
        method.invoke(list,123);
        Object s = list.get(1);
        System.out.println(s.getClass());
        List arr =  new ArrayList<>();
        arr.add("asdfasd");
        arr.add(123);
        arr.add(3L);
        System.out.println(arr);
    }
}

运行结果如下:
在这里插入图片描述


end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值