java 泛型和类型擦除

“编译期间擦除泛型”是常识(好吧,类型参数和实参实际上是被擦除的)。 这是由于“类型擦除”而发生的。 但这是错误的,正如许多开发人员所假设的那样,将<..>符号内指定的所有内容都删除了。 请参见下面的代码:

public class ClassTest {public static void main(String[] args) throws Exception {ParameterizedType type = (ParameterizedType) Bar.class.getGenericSuperclass();System.out.println(type.getActualTypeArguments()[0]);ParameterizedType fieldType = (ParameterizedType) Foo.class.getField("children").getGenericType();System.out.println(fieldType.getActualTypeArguments()[0]);ParameterizedType paramType = (ParameterizedType) Foo.class.getMethod("foo", List.class).getGenericParameterTypes()[0];System.out.println(paramType.getActualTypeArguments()[0]);System.out.println(Foo.class.getTypeParameters()[0].getBounds()[0]);}class Foo<E extends CharSequence> {public List<Bar> children = new ArrayList<Bar>();public List<StringBuilder> foo(List<String> foo) {return null; }public void bar(List<? extends String> param) {}}class Bar extends Foo<String> {}
}

你知道那是什么吗?

类java.lang.String
类ClassTest $ Bar
类java.lang.String
类java.lang.StringBuilder
接口java.lang.CharSequence

您会看到每个类型的参数都会保留下来,并且可以在运行时通过反射进行访问。 但是,什么是“类型擦除”? 必须删除某些内容吗? 是。 实际上,除结构化结构外,其他所有结构均与之相关–上面的所有内容都与类的结构有关,而不是与程序流有关。 换句话说,有关类的类型参数及其字段和方法的元数据被保留以通过反射进行访问。

但是,其余部分将被删除。 例如,以下代码:

List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while (it.hasNext()) {String s = it.next();
}

实际上将被转换为此(两个片段的字节码相同):

List list = new ArrayList();
Iterator it = list.iterator();
while (it.hasNext()) {String s = (String) it.next();
}

因此,将删除您在方法主体中定义的所有类型参数,并在需要的地方添加强制类型转换。 另外,如果定义了一个方法以接受List<T> ,则此T将被转换为Object(或如果声明了其边界,则转换为它的边界。这就是为什么您不能执行new T() (顺便说一句,有关此擦除的公开问题 )。

到目前为止,我们已经介绍了类型擦除定义的前两点。 第三个是关于桥接方法。 我已经用这个stackoverflow问题(和答案)进行了说明 。

所有这两个“道德”。 首先,java泛型很复杂。 但是您可以在不了解所有复杂性的情况下使用它们。

其次,不要假设所有类型信息都被删除了-结构类型参数在那里,因此,如果需要,可以使用它们(但不要过分依赖反射)。

翻译自: https://www.javacodegeeks.com/2014/11/on-java-generics-and-erasure.html

java 泛型和类型擦除

java 泛型和类型擦除_关于Java泛型和擦除相关推荐

  1. java注解字段类型相同_《java基础学习之——重复注解》

    在某些情况下,您要将相同的注释应用于声明或类型使用.从JavaSE 8版本开始,重复注释使您能够做到这一点. 例如,您正在编写代码以使用定时服务,使您能够在给定时间或某个时间表运行方法,类似于UNIX ...

  2. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  3. java实验泛型与容器总结_【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

  4. java泛型有什么用_什么叫泛型?有什么作用?

    一.什么是泛型? Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常. 泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊 ...

  5. java double 运算精度问题_关于java中Double类型的运算精度问题

    如果我们编译运行下面这个程序会看到什么? public class Test{     public static void main(String args[]){         System.o ...

  6. java负数用什么类型定义_(转) Java中的负数及基本类型的转型详解

    (转) https://my.oschina.net/joymufeng/blog/139952 面这行代码的输出是什么? 下面两行代码的输出相同吗? 请尝试在Eclipse中运行上面的两个代码片段, ...

  7. java8种基本类型长度_【Java基础】Java的8种基本数据类型深入介绍

    Java的8种基本数据类型介绍 基本数据类型存储大小说明,在了解存储大小说明之前我们先来了解几个基本的概念:位(bit):位表示的是二进制位,一般称为比特,是计算机存储的最小单位. 字节(byte): ...

  8. java 多态判断非空_收藏Java 面试题全梳理

    脚本之家 你与百万开发者在一起 来源 | Java建设者(ID:javajianshe) 作者 |cxuan 如若转载请联系原公众号 Java 基础篇 Java 有哪些特点 并发性的:你可以在其中执行 ...

  9. java 中文域名转码_转换java方法

    java date String 类型相互转换 这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: 也是最简单的方法 Date date=new D ...

最新文章

  1. 如何培养一个搞垮团队的Leader?
  2. uvalive4744(数论)
  3. Java黑皮书课后题第4章:*4.11(十进制转十六进制)编写程序,提示用户输入0~15之间的一个整数,显示其对应的十六进制数。对于不正确的输入数字,提示非法输入
  4. 回顾 | 进击吧! Blazor!系列
  5. Vue.js 定义组件模板的七种方式
  6. 【转】如何开始学习CoreCLR源代码?
  7. Coin3D快速上手教程
  8. 方舟生存进化掉落物代码
  9. 小册上新 | 区块链开发入门:从 0 到 1 构建基于以太坊智能合约的 ICO DApp
  10. 加不了buff的BuffX,还能让年轻人买单多久?
  11. 【零样本学习】Zero-Shot Learning via Class-Conditioned Deep Generative Models
  12. 面试官:如何设计群聊消息的已读未读功能?
  13. hdu 6441 (费马大定理+勾股数 数学)
  14. 2022081班李亚楠20220914
  15. 基于FPGA的LD3320语音识别模块驱动设计
  16. 如何不翻墙访问ChatGpt?
  17. linux系统启动的第一个进程是,CentOS6开机启动过程详解
  18. 对学习软件“佳佳儿童乐园”的测评
  19. 在html中让页面从彩色变成黑白
  20. 工字型钢弹性截面模量计算公式_截面模量的计算公式是什么?

热门文章

  1. P6477-[NOI Online #2 提高组]子序列问题【线段树】
  2. jzoj3913-艰难的选择【差分,统计】
  3. 【LCT】旅游(P1505)
  4. 【DP】建学校问题(luogu 2803/2018 特长生 T3)
  5. 【快速幂】小明解密码 (jzoj 2146)
  6. [集训队作业2018] 三角形(贪心,堆,线段树合并)
  7. [XSY] 树与图(树形DP、生成函数、分治NTT、重链剖分)
  8. 2014 ACM/ICPC Asia Regional Xi'an Online
  9. Oracle入门(七B)之表空间删除数据文件未删除
  10. 统一配置中心的设计方案