版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——Java的泛型擦除和运行时泛型信息获取Java的泛型擦除和运行时泛型信息获取
只要理解了Java引入泛型擦除的理由,也自然能理解如何在运行时获取泛型信息了。下面是我为大家带来的Java的泛型擦除和运行时泛型信息获取的学识,接待阅读。
Java的泛型擦除
程序员界有句流行的话,叫talkischeap,showmethecode,所以话不多说,看代码。
代码一
Java代码
Classc1=newArrayList.getClass;
Classc2=newArrayList.getClass;
System.out.printlnc1==c2;
/*Output
true
*/
ArrayList和ArrayList在编译的时候是完全不同的类型。你无法在写代码时,把一个String类型的实例加到ArrayList中。但是在程序运行时,的确实确会输出true。
这就是Java泛型的类型擦除造成的,由于不管是ArrayList还是ArrayList,在编译时都会被编译器擦除成了ArrayList。Java之所以要制止在创造泛型实例时而创造新的类,从而制止运行时的过度消耗。
代码二
Java代码
Listlist=newArrayList;
Mapmap=newHashMap;
System.out.printlnArrays.toStringlist.getClass.getTypeParameters;
System.out.printlnArrays.toStringmap.getClass.getTypeParameters;
/*Output
[E]
[K,V]
*/
我们可能期望能够获得真实的泛型参数,但是仅仅获得了声明时泛型参数占位符。getTypeParameters方法的Javadoc也是这么解释的:仅返回声明时的泛型参数。所以,通过getTypeParamters方法无法获得运行时的泛型信息。
运行泛型信息的获取
但是在有些场景中,我们还是需要获取泛型信息的。譬如,在调用HTTP或RPC接口时,我们需要举行序列化和反序列的工作。
例如,我们通过一个HTTP接口接收如下的JSON数据
Java代码
[
name:Stark,
nickName:IronMan
,
name:Rogers,
nickName:CaptainAmerica
]
我们需要将其映射为List。
但是之前我们提到了泛型擦除,那我们所使用的HTTP或RPC框架是如何获取List中的泛型信息呢?
再看一段代码
Java代码
Mapmap=newHashMap;
Typetype=map.getClass.getGenericSuperclass;
ParameterizedTypeparameterizedType=ParameterizedType.class.casttype;
forTypetypeArgument:parameterizedType.getActualTypeArguments
System.out.printlntypeArgument.getTypeName;
/*Output
java.lang.String
java.lang.Integer
*/
上面这段代码表示了如何获取map这个实例所对应类的泛型信息。鲜明,这次我们告成获得了其中泛型参数信息。有了这些泛型参数,上面所提到的序列化和反序列化工作就是可能的`了。
那为什么之前不成以,而这次可以了呢?请留神一个细节
上一节的变量声明
Java代码
Mapmap=newHashMap;
本节的变量声明
Java代码
Mapmap=newHashMap;
其中最关键的区别是本节的变量声明多了一对大括号。有确定Java根基的同学都能看出本节的变量声明其实是创造了一个匿名内部类。这个类是HashMap的子类,泛型参数限定为了String和Integer。
其实在“泛型擦除”一节,我们已经提到,Java引入泛型擦除的理由是制止由于引入泛型而导致运行时创造不必要的类。那我们其实就可以通过定义类的方式,在类信息中留存泛型信息,从而在运行时获得这些泛型信息。
简而言之,Java的泛型擦除是有范围的,即类定义中的泛型是不会被擦除的。
框架中的应用
其实好多框架就是使用类定义中的泛型不会被擦除这个特性,实现了相应的功能。
例如,SpringWeb模块的RestTemplate,我们可以使用如下写法:
Java代码
ResponseEntityresponseEntity=restTemplate.exchangeurl,HttpMethod.GET,null,newParameterizedTypeReference;
其中的newParameterizedTypeReference就是通过定义一个匿名内部类的方式来获得泛型信息,从而举行反序列化的工作。
总结
Java泛型擦除是Java泛型中的一个重要特性,其目的是制止过多的创造类而造成的运行时的过度消耗。所以,想ArrayList和ArrayList这两个实例,其类实例是同一个。
但好多处境下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025北京大学物理学院招聘1名劳动合同制工作人员笔试考试备考题库及答案解析
- 2025中煤智慧科技(张家口)有限公司面向社会招聘2人笔试考试参考试题及答案解析
- 2025福建厦门海峡投资有限公司社会招聘6人笔试考试参考试题及答案解析
- 新感觉派课件
- 2026广东汕尾市中山大学孙逸仙纪念医院深汕中心医院事业单位招聘49人(骨干人才第一批)考试笔试备考试题及答案解析
- 2025年聊城中通客车集团招聘(102人)笔试考试备考试题及答案解析
- 新年表演课件
- 肘关节脱位健康宣教
- 暨南大学中文课件
- 暖通专业中级职称课件
- 安全通道防护棚施工方案
- 有机肥可行性研究报告
- 2025年-基于华为IPD与质量管理体系融合的研发质量管理方案-新版
- 法律职业资格考试客观题(试卷一)试卷与参考答案(2025年)
- 腹壁下动穿支课件
- 2025-2030集中式与分散式青年公寓运营效率对比分析
- 广西协美化学品有限公司年产7400吨高纯有机过氧化物项目环评报告
- 智慧树知道网课《艾滋病、性与健康》课后章节测试答案
- 配电施工工艺培训
- 2025年全国教师师德网络培训考试题库及答案
- 2025年医院新进人员岗前培训综合试题(附答案)
评论
0/150
提交评论