Java泛型小记
最近写 library,遇到几个 Java 泛型的问题,在此记录一下。
众所周知 Java 泛型是运行期擦除的,但有个特例,就是继承可以保留父类的泛型信息,关于这个特例的应用,想必
熟悉 Spring RestTemplate
的同学肯定知道 org.springframework.core.ParameterizedTypeReference
这个类,
此类就是利用的父类保留泛型信息的特性来实现泛型信息传递的。
关于 ParameterizedTypeReference
类的详细信息,可以参考其源代码,并阅读此文:Neal Gafter on Super Type Tokens 深入了解其原理。
ParameterizedTypeReference
的实现原理其实是很简单的,就是利用了 ((ParameterizedType)Class.getGenericSuperclass()).getActualTypeArguments()
方法。
Spring core 里面有个工具类可以很方便地获取某类的父类的泛型信息,那就是 org.springframework.core.GenericTypeResolver
。
这个工具类超级方便好用。但奇怪的是,同为 org.springframework.core
包下的 ParameterizedTypeReference
类却没有用它来获取父类的泛型,这是为什么呢?
另外,使用 GenericTypeResolver
的时候请特别注意一下它的说明:
Mainly intended for usage within the framework,
管他呢,反正能用就行。
另外突然想到了说一下,写 library 的同学肯定经常会处理 Annotation
,Spring 里面有个炒鸡炒鸡好用的 org.springframework.core.annotation.AnnotationUtils
,望悉知。
- 完 -