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

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

假设已经有类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);

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

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

  1. 十分钟理解Java泛型擦除

    泛型信息只存在于代码编译阶段,但是在java的运行期(已经生成字节码文件后)与泛型相关的信息会被擦除掉,专业术语叫做类型擦除. 今天我们来讲解泛型中另一个重要知识点--泛型擦除! 泛型擦除概念 泛型信 ...

  2. 【Java 泛型】使用上下边界通配符解决泛型擦除问题

    文章目录 前言 一.使用上边界通配符示例 二.分析字节码的附加信息 前言 上一篇博客 [Java 泛型]泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通 ...

  3. 泛型擦除机制、自定义注解、代理、反射

    一.泛型擦除机制 1.泛型只在编译阶段限制,之后会擦除.    二.注解 1.注解介绍   2.JDK自带注解   3.元注解  @Target     @Retention 转载于:https:// ...

  4. 什么是泛型,为什么要使用泛型? 泛型类和泛型方法的实现以及限定通配符的使用。什么是泛型擦除,为什么有泛型擦除,泛型擦除到底是怎么实现的

    1. 泛型的定义和意义 1.1 什么叫泛型? 泛型,顾名思义就是广泛的类型,专业术语为"参数化类型":当我们创建对象时没指定类型,任何引用类型都可以使用,兼容多种数据类型.如果是基 ...

  5. 深入理解 Java 泛型擦除机制

    我们都知道 Java 中的泛型可以在编译期对类型检查,避免类型强制转化带来的问题,保证代码的健壮性.不同语言对泛型的支持也不一样,Java 中的泛型类型在编译期会擦除,下面一个例子可以证明这一点: p ...

  6. 什么是泛型、为什么要使用以及泛型擦除

    泛型,即"参数化类型". 创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换. Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译 ...

  7. java同事不写泛型_跳了一次JAVA泛型擦除的坑

    记录一下今天在帮同事解决使用spring参数注入问题的时候由于对泛型的理解不到位而遇到的坑. 如下代码所示: @RequestMapping(value="saveAll") pu ...

  8. java 获取泛型_聊聊Java泛型擦除那些事

    >版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...

  9. 才学了泛型,简单说一下我对java泛型擦除和补偿的一些理解

    其实Java 的泛型是伪泛型,在JVM运行的时候,所有的泛型信息都会被擦除掉.举个例子,ArrayList<Integer> list,在编译的时候你调用add()方法,只能传入Integ ...

最新文章

  1. R语言KMeans聚类分析确定最优聚类簇数实战:间隙统计Gap Statistic(确定最优聚类簇数)
  2. Linux——33条小技巧
  3. 每天一个 Linux 命令(13):less 命令
  4. 简单的选择排序(内部排序)
  5. 处理android11以上无法删除相册图片的问题
  6. TypeScript 里的 unknown 和 never
  7. 光是无限远服务器有道馆吗,光是无限远服务器客户端
  8. Spark源码分析之MemoryManager
  9. 请举例说明python中**运算符的含义_举例讲解Python中的身份运算符的使用方法
  10. Redis缓存持久化:RDB持久化和AOF持久化
  11. C#网络Socket编程
  12. 计算机音乐A谱,WPSOffice谱写音乐简谱
  13. 【Endnote】CNKI E-Study与Endnote 的参考文献题录互导
  14. 免费客户旅程(Customer Journey Mapping) 示例总汇
  15. 商业研究(10):比呀比-海淘电商-海外正品直邮-高品质跨境购物平台
  16. 小提琴统计图_小提琴图解读 - 统计学
  17. 买二手房不后悔先知道8件事 高楼层未必卖得好
  18. 【CCNP | 网络模拟器GNS系列】安装、配置和使用 GNS3
  19. 生存模型的C-index(C指数)
  20. Android 10适配要点,作用域存储

热门文章

  1. 校园服务器系统的意义,浅谈校园网络建设的意义与作用.doc
  2. python 矩阵特征值_用python求矩阵特征值的方法?
  3. RequestContextHolder获取request
  4. MySQL大表传输表空间的坑
  5. android横向瀑布流布局,GitHub - wikison/android_waterfall: Android版的瀑布流布局
  6. 文本溢出及其在angular中失效的bug
  7. 关于 ZAO 换脸 App 中你需要注意的个人隐私问题
  8. 一个屌丝程序猿的人生(八十一)
  9. 快手2019秋季校园招聘算法笔试A卷编程题 - 题解
  10. 求职软件开发工程师,我需要准备什么?一些资源分享