如何优雅地实现泛型类的类型参数化
反射机制是Java的一个非常实用的特性. 基于反射, 我们可以实现下面的接口
将类型作为参数传入方法中, 方法可以根据具体的类实现不同的逻辑, 返回不同数据类型的结果. 这十分有利于减少代码的冗余度和耦合度, 在复杂多样的业务场景中非常有用.
然而, 当反射遇到泛型, 问题就变的棘手起来. 我们常常会遇到这么一个情景: 传入的类型参数是泛型类的类型。
举个例子, 在开发中, 我们经常需要接入一些外部系统的Restful API. 通常, 除了业务数据部分外, 这些API的请求构建, 响应处理的逻辑都是一样的. 自然而然, 我们会想把接口的请求逻辑封装为一个方法来实现复用. 然而, 在处理响应的过程中, 我们需要对接口的返回结果进行反序列化. 假设外部接口返回的数据结构如下
T
为业务数据类型, 不同的接口业务数据结构会不一样. 我们需要根据 ResponseDTO
和 T
, 反射出类型 ResponseDTO<T>
. 如果实现不了泛型类的参数化, 对于每一个业务接口的数据类型T
, 我们都要显式继承 ResponseDTO
得到静态的子类类型, 未免特别冗余和不优雅.
幸好, 至 Java 1.7 开始, java.lang.reflect
提供了Interface ParameterizedType
. 通过实现这个接口, 我们可以实现泛型类的类型的参数化, 代码如下:
利用这个类, 我们就可以实现参数化类型, 封装出某外部系统通用的HTTP调用方法:
GET请求
POST请求
在调用时, 我们构造好请求对象和业务部分数据结构, 就可以得到对应的返回.
甚至, 泛型类的子类也可以参数化传入:
子类的参数类型也可以参数化, 使用ParameterizedTypeImp
构造其类型即可:
版权声明: 本文为 InfoQ 作者【KAMI】的原创文章。
原文链接:【http://xie.infoq.cn/article/c5382aa3301791e5e56593645】。文章转载请联系作者。
评论