当前位置:首页 > 技术分析 > 正文内容

你了解泛型被擦除以后又是如何获取到实际类型呢?

ruisui882个月前 (03-11)技术分析14

一、什么是泛型

百科定义:JDK在1.5版本中引入的新特性,在定义类型的时候可以是一个“参数类型”,对应的有泛型类,泛型接口及泛型方法。

Java中的泛型是伪泛型,这个我们后面会讲到

示例

public class Generator //泛型类

public interface Generator //泛型接口

public void generator(T t) //泛型方法


二、为什么要引入泛型

核心就一点:类型安全;如果没有泛型,那就必须使用强制类型转换,这样是极不安全的,在运行时很容易出现类型转换的异常,如果使用泛型,在编译阶段就可以避免出现该类问题。

三、什么是泛型擦除

“泛型擦除”这个词很有意思,也是我们今天讨论的重点。顾名思义,就是JVM在编译阶段将泛型给去除掉,实际运行的时候是没有泛型概念的,可能读者会比较好奇,为什么要这么干,之前不是鼓励定义泛型吗?其实这个“擦除”不是程序员的行为,而是编译器的行为:

编译器在将java文件编译成class文件的过程中会将我们定义的泛型擦除

那么接下来的问题来了,编译器为什么要这么干?关于这个问题,其实在开始介绍泛型定义的时候就提到关键的一点

Java中的泛型是“伪泛型”,而不是“真泛型”

“为什么要泛型擦除”这个问题实际上就变成了“为什么Java要实现伪泛型”,核心原因我觉的就一点吧:兼容性,为了兼容1.5之前的Java应用,让低版本的应用可以在高版本的JVM上运行,具体的本文就不做详细的赘述了,读者如果有兴趣可以百科下。

四、泛型擦除后运行时如何获取具体的类型

我们在开发业务代码的过程中,经常会遇到如下情况,请求一个外部接口,该接口返回json,是一个字符串,我们再将其转换成自己定义的类型,比如

[{"name":"张三","age":30},{"name":"李四","age":40}]

上述报文我们将其转换成List,其中的Person就是泛型,那么问题来了,编译阶段泛型不是被擦除了么,为什么还能转换成我们所定义的泛型呢?

//代码示例,内部封装的json解析工具是Gson
Response<List> response = 
  JsonHelper.parseObject(result, new TypeToken<Response<List>>() {
                    });

上面代码中的List这都是泛型,Gson是如何反解析出原始类型的呢,通过查看TypeToken的源代码发现关键点有两个:

1、new TypeToken(){} 创建匿名类

2、其内部的resolveType方法(细节不在这里展示了,有兴趣的读者可以去看看源码)

resolveType方法最终是通过反射还是能拿到泛型的实际类型,明明在编译的时候擦除了,这不是前后矛盾,至此引出本文的关键点:

泛型擦除是有范围的,针对类内部定义的泛型是不会被擦除的

很多框架都是利用了这个特性来获取泛型的

五、总结

  1. Java中的泛型是伪泛型,编译时会被擦除
  2. 官方搞伪泛型是折中方案,考虑兼容性
  3. 泛型擦除是有范围的,类内部定义的泛型不会擦除

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2709.html

标签: ts void
分享给朋友:

“你了解泛型被擦除以后又是如何获取到实际类型呢?” 的相关文章

Git 分支管理策略汇总

最近,团队新入职了一些小伙伴,在开发过程中,他们问我 Git 分支是如何管理的,以及应该怎么提交代码?我大概说了一些规则,但仔细想来,好像也并没有形成一个清晰规范的流程。所以查了一些资料,总结出下面这篇文章,一共包含四种常见的分支管理策略,分享给大家。Git flow在这种模式下,主要维护了两类分支...

GitLab 14.6发布,优化Geo高可用,安全更新等

昨天,GitLab官方按照管理发布了有一个月度版本GitLab 14.6的发布,这也是本年度收官版本。14.6中在安全合规性方面,在Geo方面以及MD代码块一键复制等方便做了优化,另外还在UI图标方面发布了一套全新的图标。详细情况请和虫虫一起学习。GitLab 14.6主要改进使用 Geo 实现无缝...

祸害阿里云宕机3小时的IO HANG究竟是什么?

本文来自微信公号“CSDN”(ID:CSDNnews),作者 | 王知无, 责编| 郭 芮。2019年3月3日凌晨,微博炸锅,有网友反映说阿里云疑似出现宕机,华北很多互联网公司受到暴击伤害,APP、网站全部瘫痪,我自己的朋友圈和微信群里也有好友反馈,刚刚从被窝被叫起来去修Bug,结果发现服务器登不上...

BuildKit 镜像构建工具

#暑期创作大赛#快速开始 对于 Kubernetes 部署,请参阅examples/kubernetes。BuildKit 由buildkitd守护进程和buildctl客户端组成。虽然buildctl客户端可用于 Linux、macOS 和 Windows,但buildkitd守护程序目前仅适用于...

2024年,不断突破的一年

迈凯伦F1车队不久前拿下了2024年度总冠军,距离上一次还是二十几年前。在此期间,另一领域内,一个充满革新活力的腕表品牌——RICHARD MILLE理查米尔,正不断发展,与F1运动、帆船、古董车展等领域,共享着对速度与极限的无尽向往。RICHARD MILLE的发展与F1车手们在赛道上的卓越表现交...

虚幻引擎5.5发布

IT之家 11 月 13 日消息,虚幻引擎 5.5 现已发布。据介绍,新版本虚幻引擎在动画创作、虚拟制作和移动游戏开发方面取得进步;渲染、摄像机内视觉特效和开发人员迭代等领域的部分功能已可用于生产。IT之家整理部分功能亮点如下:动画Sequencer增强虚幻引擎的非线性动画编辑器 Sequencer...