Cing
Published on 2025-07-05 / 4 Visits
0

在 Java 中通过抽象类获取泛型实例的方法

例如我们有一个 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);
}