javaee论坛

普通会员

225648

帖子

332

回复

346

积分

楼主
发表于 2019-11-03 06:58:34 | 查看: 514 | 回复: 0

在学习集合的时候,我们会接触到泛型。利用泛型,可以很好的控制集合中添加的数据。但是深入了解之后,会发现泛型只在编译时期起作用。而运行时期泛型会被擦除。

什么意思呢?举个简单的例子,坐火车要过安检。就相当于泛型的作用就相当于安检。只在进站的时候起作用,而你进去之后通过其它手段拿到了一些违禁品安检也管不到你。

假设已经有类Egg、Coke两个类。分别是鸡蛋、可乐。

先创建一个可乐瓶:

publicvoiddemo1(){//创建一个只能装可乐的可乐瓶List<Coke>cokeBottle=newArrayList<Coke>();}

然后尝试放鸡蛋进去:

Eggegg=newEgg();Cokecoke=newCoke();//添加可乐没有问题cokeBottle.add(coke;)//放入鸡蛋。这时候,这句代码会报错cokeBottle.add(egg);

因为泛型的关系,放鸡蛋的代码出错了。那么要怎么才能放鸡蛋呢?我们先获取cokeBottle(可乐瓶)编译后的Class对象:

Class<?extendsList>aClass=cokeBottle.getClass();

然后把添加可乐的方法找到:

Methodadd=aClass.getDeclaredMethod("add",Object.class);

然后再来放鸡蛋:

//因为是使用反射,这个时候泛型已经被擦除了。可以添加任何数据add.invoke(cokeBottle,egg);

这样就把鸡蛋放进去了,前面的代码是有异常的,大家可以自由抓或者抛。


您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017