我有以下课程:

public abstract class ClassWithHelper<T extends HelperInterface> {
    Class<T> helperClass;
    protected T helper;
        protected Gson gson = new GsonBuilder().create();

        public void loadHelper(String helperString) throws InstantiationException,        IllegalAccessException {
        if (!Strings.isNullOrEmpty(helperString)) {
            wizard = gson.fromJson(helperString, getHelperClass());
        } else {
            wizard = getHelperClass().newInstance();
        }
    }

    protected abstract Class<T> getHelperClass();
}

public class ImplementingClass extends ClassWithHelper<HelperClass> {

    @Override
    protected Class<HelperClass> getHelperClass() {
        return HelperClass.class;
    }
}


现在,很好的是,当我调用ImplementationClass.helperClass时,它会自动将其强制转换为HelperClass。但是,我想知道我是否真的需要编写和覆盖getHelperClass。我无法编写helper.getClass(因为它可能为null),而且我知道我编写它的方式存在类型擦除问题。

但是,有没有一种方法可以重写我的代码,从而避免以两种方式声明helperClass并仍然具有类型推断功能?

最佳答案

尝试这个 :

protected Class<T> getHelperClass() {
    final ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
    return (Class<T>) parameterizedType.getActualTypeArguments()[0];
}

10-04 13:23