例如我们有一个 CheckService 抽象类,期望根据不同的参数输入转派给不同的实现类,并且在抽象类这一层就完成参数类型的转化
我们不能直接通过形如 T 这种泛型参数去实现参数转化,因为 Java 存在泛型擦除,在抽象类中实际上是不知道 T 究竟是什么类型的
那该如何解决这个问题呢?
借用构造函数,在每一个具体的实现类创建时,就能获取到真实的泛型类型了,具体可参考下面的代码
public abstract class CheckService<T> {
private final TypeReference<T> ref;
/**
* 通過构造方法在创建实例时获取的真实的类型并保存起来,供 convert 方法使用
*/
protected CheckService() {
Type superClass = getClass().getGenericSuperclass();
Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
ref = new TypeReference<>() {
@Override
public Type getType() {
return type;
}
};
}
protected void process(String jsonParam) {
T convert = convert(jsonParam);
handle(convert);
}
protected T convert(String json) {
return JSONUtil.fromJSON(json, ref);
}
protected abstract void handle(T param);
}