泛型擦除,教你怎么用可乐瓶装鸡蛋

举报
北山啦 发表于 2021/05/26 01:42:42 2021/05/26
【摘要】 在学习集合的时候,我们会接触到泛型。利用泛型,可以很好的控制集合中添加的数据。但是深入了解之后,会发现泛型只在编译时期起作用。而运行时期泛型会被擦除。 什么意思呢?举个简单的例子,坐火车要过安检。就相当于泛型的作用就相当于安检。只在进站的时候起作用,而你进去之后通过其它手段拿到了一些违禁品安检也管不到你。 假设已经有类Egg、Coke两个类。分别是鸡蛋、可乐。 先创建一...

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

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

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

先创建一个可乐瓶:


  
  1. public void demo1(){
  2. //创建一个只能装可乐的可乐瓶
  3. List<Coke> cokeBottle = new ArrayList<Coke>();
  4. }

然后尝试放鸡蛋进去:


  
  1. Egg egg = new Egg();
  2. Coke coke = new Coke();
  3. //添加可乐没有问题
  4. cokeBottle.add(coke;)
  5. //放入鸡蛋。这时候,这句代码会报错
  6. cokeBottle.add(egg);

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

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

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

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

然后再来放鸡蛋:


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

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

文章来源: zacksock.blog.csdn.net,作者:ZackSock,版权归原作者所有,如需转载,请联系作者。

原文链接:zacksock.blog.csdn.net/article/details/100835233

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。