泛型擦除,教你怎么用可乐瓶装鸡蛋
【摘要】 在学习集合的时候,我们会接触到泛型。利用泛型,可以很好的控制集合中添加的数据。但是深入了解之后,会发现泛型只在编译时期起作用。而运行时期泛型会被擦除。
什么意思呢?举个简单的例子,坐火车要过安检。就相当于泛型的作用就相当于安检。只在进站的时候起作用,而你进去之后通过其它手段拿到了一些违禁品安检也管不到你。
假设已经有类Egg、Coke两个类。分别是鸡蛋、可乐。
先创建一...
在学习集合的时候,我们会接触到泛型。利用泛型,可以很好的控制集合中添加的数据。但是深入了解之后,会发现泛型只在编译时期起作用。而运行时期泛型会被擦除。
什么意思呢?举个简单的例子,坐火车要过安检。就相当于泛型的作用就相当于安检。只在进站的时候起作用,而你进去之后通过其它手段拿到了一些违禁品安检也管不到你。
假设已经有类Egg、Coke两个类。分别是鸡蛋、可乐。
先创建一个可乐瓶:
-
public void demo1(){
-
//创建一个只能装可乐的可乐瓶
-
List<Coke> cokeBottle = new ArrayList<Coke>();
-
}
然后尝试放鸡蛋进去:
-
Egg egg = new Egg();
-
Coke coke = new Coke();
-
//添加可乐没有问题
-
cokeBottle.add(coke;)
-
//放入鸡蛋。这时候,这句代码会报错
-
cokeBottle.add(egg);
因为泛型的关系,放鸡蛋的代码出错了。那么要怎么才能放鸡蛋呢?我们先获取cokeBottle(可乐瓶)编译后的Class对象:
Class<? extends List> aClass = cokeBottle.getClass();
然后把添加可乐的方法找到:
Method add = aClass.getDeclaredMethod("add", Object.class);
然后再来放鸡蛋:
-
//因为是使用反射,这个时候泛型已经被擦除了。可以添加任何数据
-
add.invoke(cokeBottle, egg);
这样就把鸡蛋放进去了,前面的代码是有异常的,大家可以自由抓或者抛。
文章来源: zacksock.blog.csdn.net,作者:ZackSock,版权归原作者所有,如需转载,请联系作者。
原文链接:zacksock.blog.csdn.net/article/details/100835233
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)