Java的泛型擦除和运行时泛型信息获取_第1页
Java的泛型擦除和运行时泛型信息获取_第2页
Java的泛型擦除和运行时泛型信息获取_第3页
Java的泛型擦除和运行时泛型信息获取_第4页
Java的泛型擦除和运行时泛型信息获取_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论