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

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

ruisui883个月前 (03-11)技术分析19

一、什么是泛型

百科定义: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
分享给朋友:

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

15款测试html5响应式的在线工具

手机、平板灯手持设备的增多,网站要顺应变化,就必须要做响应式开发,响应式网站最大的特点在于可以在不同设备下呈现不同的布局,是基于html5+css3技术,目前越来越多的网站开始采用了响应式设计,而下面15款工具可以方便测试你的html5响应式效果。Responsinatorhttp://www.re...

虚幻引擎5.5现已发布 手游开发、动画制作重大改进

Epic在今天发布了虚幻引擎5.5,现可通过Epic Launcher下载。此版本在动画创作、渲染、虚拟制片、移动端游戏开发和开发人员迭代工具集等方面做出了重大改进。 官方博客:虚幻引擎5.5现已发布,在动画创作、虚拟制作和移动游戏开发方面取得了显著进步,渲染、摄像机内视觉特效和开发人员迭代等领域的...

别让“跑焦”毁所有!仅需这一项设置,即可显著改善镜头对焦精度

我常常会收到一些摄影爱好者的私信,也一直在努力的帮助大家解决更多摄影中常见问题。在我收到的所有问题中。有一个问题是最麻烦的,那就是“为什么我的图像看起来模糊?”。这个问题几乎每个人都遇到过,究其原因可以说是多种多样相对复杂。起初我一直认为是对焦问题所导致,也就有了我之前所写的“后按对焦”以及“对焦模...

VUE3+JAVA商城源码小程序APP商城

三勾小程序商城基于springboot+element-ui+uniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端,包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。软件架构后端: springboot2.3.12管...

千智云低代码平台 v2.0.6发布「平台升级」

【平台简介】千智云低代码应用平台是一款低代码开发+低代码PaaS+SaaS应用中台为一体的应用平台。平台提供了多种应用场景功能及应用组件,满足各种应用的基本实现,可以使用低代码开发的方式,定制化的开发软件项目,并使用平台提供的各种功能,提供了大多数业务场景的支持。也可以将开发的应用发布到平台,成为S...

尤雨溪:细聊 Vue 的现在与未来

大家好,我是 Echa。创作不易,喜欢的老铁们转发加个关注,点个赞,速速收藏,谢谢!另外咱们一起回顾一下Vue 优秀开源项目:12个又简单又实用的开源项目及组件推荐13个又热门又实用的Vue开源宝典库推荐7个Vue 3的高颜值UI组件库分享15个基于Vue3.0全家桶的优秀开源项目推荐10个基于Vu...