java中泛型擦除_Java 的泛型擦除

java中泛型擦除_Java 的泛型擦除说到泛型 就不得说起 擦除 这个概念 相比于 c 来说 java 的泛型只存在于程序的源码中 在编译后的 class 文件中不存在 这个过程就是泛型 擦除 所以 对于 newArrayList 和 newArrayList 来说 两个对象在编译之后两者是一样的 通过反射均可以向集合中添加任意类型的对象 编译前 publicstatic String args Clas

说到泛型,就不得说起“擦除”这个概念,相比于c#来说,java的泛型只存在于程序的源码中,在编译后的class文件中不存在,这个过程就是–泛型”擦除”;所以,对于new ArrayList 和 new ArrayList 来说,两个对象在编译之后两者是一样的,通过反射均可以向集合中添加任意类型的对象;

编译前:

public static void main(String[] args) {

Class c1 = new ArrayList().getClass();

Class c2 = new ArrayList().getClass();

System.out.println(c1 == c2);

}

编译后:

public static void main(String[] args) {

new ArrayList();

new ArrayList();

}

可以看到,在编译后的class文件中,ArrayList所声明的泛型不存在了;由此可知,如果想在程序运行期间获取泛型,看似是一件不可能完成的事情!

Map map = new HashMap<>();

map.put(0, 0L);

map.put(1, 1L);

String a = JSON.toJSONString(map);

map = JSON.parseObject(a, new TypeReference>(){});

按照泛型擦除,泛型在编译后的class文件中就不存在了, 知会保留原始类型(Type的概念),那么TypeReference又是如何获取到具体的泛型类型的呢?

查看TypeReference的源码,发现在其构造方法中,主要使用到了getGenericSuperclass()和getActualTypeArguments()两个方法,getGenericSuperclass()返回的是此对象带“泛型”的父类,而getActualTypeArguments()返回的是此父类中实际类型参数的Type 对象数组,说白了就是TypeReference<>中的泛型;

如果非匿名内部类,通过getActualTypeArguments() 获取的仍然是Type中的概念;如果声明了匿名内部类,则在编译时会将此匿名内部类但对生成一个class文件

创建的匿名内部类new TypeReference>(){},在生成的的class文件中,编译器默认为TypeReference中的泛型Map原始类型,并不会进行擦除!类似于 我们实际创建一个类 Class TypeReference>{} ,和Class Test{}一样,在编译后Map、T依旧会存在!

由此,对于java泛型的“擦除”并不能一概而论,在运行期间,如果方法中出现带泛型的匿名内部类,那么泛型依旧会被保留下来,我们可以通过对应的方法获取到实际的泛型类型!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176979.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午8:35
下一篇 2026年3月26日 下午8:36


相关推荐

  • Datagrip2021.8.3激活码【中文破解版】[通俗易懂]

    (Datagrip2021.8.3激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS3…

    2022年3月25日
    92
  • moxa串口服务器的配置(波特率如何设置)

    MOXA串口服务器产品配置说明附图.doc第一章:准备工作准备工作我们用一条交叉网线把NPort5110和PC机的网口连接起来,并把NPort上电。首先,打开控制面板,网络连接。在本地连接上点右键,选择属性。双击进入Internet协议(TCP/IP),点击“使用下面的IP地址”写入IP地址和子网掩码,记住要和NPORT的IP地址在同一子网段内。如NPORT默认IP为192.168…

    2022年4月9日
    120
  • ELK 搭建

    ELK 搭建ELKlinux 环境搭建

    2026年3月26日
    3
  • Qt之GIF录制工具

    Qt之GIF录制工具一 效果二 特性 1 高压缩比 几百 K 即可拥有丰富的 gif 图 2 支持录制鼠标指针 3 支持设置帧率 4 捕捉框框所在的录制范围内画面无变化时 不会增加新的帧 而是只会增加延时 可以非常有效减小 GIF 文件的体积 5 录制过程中 支持暂停和继续三 GIF 存储结构 GIF 是一种使用 LZW 压缩 支持多张图像的容器 支持 256 色 透明通道为 1bit 作为互联网表情包的载体 GIF 这项 80 年代的技术依然生生不息 但它的弊端也是显而易见的 易出现毛边 色彩表现低劣 文件压缩比不高 针对这些问题 M

    2026年3月18日
    3
  • 计算机二级选择题——数据结构与算法[通俗易懂]

    计算机二级选择题——数据结构与算法[通俗易懂]按照自己的理解写的解题思路,如有错误希望指正。1.算法的复杂度: ①时间复杂度:执行算法所需的计算工作量(又叫:基本运算次数) ②空间复杂度:执行算法所需的内存 它们是没有任何关系的!!!2.求二叉树序列类题目 要点:前序—根左右 中序—左根右 后序—左右根 例1:已知前序ABCDE,中序BCADE,求后序;同类型,已知任意两个求第三个 解题思路: 由前序知道A是根,结合中序,CB是左子树,DE…

    2022年8月18日
    9
  • pycharm如何更换国内镜像源

    pycharm如何更换国内镜像源阿里云 http mirrors aliyun com pypi simple 中国科技大学 https pypi mirrors ustc edu cn simple 豆瓣 douban http pypi douban com simple 清华大学 https pypi tuna tsinghua edu cn simple 中国科学技术大学 http pypi mirrors ustc edu cn simple

    2026年3月27日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号