0

我有以下课程:

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 (因为它可能是空的),而且我知道我写它的方式有一个类型擦除问题。

但是,有没有办法让我重写我的代码以避免必须以两种方式声明 helperClass 并且仍然对其进行类型推断?

4

3 回答 3

3

试试这个 :

protected Class<T> getHelperClass() {
    final ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
    return (Class<T>) parameterizedType.getActualTypeArguments()[0];
}
于 2012-08-13T15:48:32.530 回答
1

Afaik,除非您可以反思,否则helper遗憾的是没有可用的运行时类型信息 - 泛型严格来说是一种编译时工具。

有不同的方法可以做到这一点 - 将类型作为参数包含到 ClassWithHelper 的构造函数中,而不是重写方法,或者强制子类型提供helperFromJSONnewHelper方法 - 如果您认为这样看起来更好,但如果您在运行时需要该类型,您可以需要“以两种方式陈述”。

于 2012-08-13T15:33:08.770 回答
1

这个怎么样:

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();
        }
    }

    public Class<T> getHelperClass() {
        return helperClass;
    }

    protected ClassWithHelper(Class<T> helperClass) {
        this.helperClass = helperClass;
    }

}

public class ImplementingClass extends ClassWithHelper<HelperClass> {

    public ImplementingClass() {
        super(HelperClass.class);
    }

}
于 2012-08-13T15:54:02.390 回答