@月黑风高食肉虎 噗噗虎的技术博客

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,望悉知。