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

すばらしいのは、implingingClass.helperClass を呼び出すと、それが自動的に HelperClass にキャストされることです。ただし、getHelperClass を作成してオーバーライドする必要があるかどうかは疑問です。私は helper.getClass を書くことができません (null の可能性があるため)。それを書いた方法には型消去の問題があることを知っています。

ただし、コードを書き直して、helperClass を 2 つの方法で記述しなくても型を推論できるようにする方法はありますか?

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

helper残念ながら、 を熟考できない限り、利用可能なランタイム型情報はありません。ジェネリックは厳密にはコンパイル時のツールです。

これを行うにはさまざまな方法があります。メソッドをオーバーライドする代わりに、型を ClassWithHelper のコンストラクターにパラメーターとして含めるか、サブタイプに強制的にhelperFromJSONメソッドを提供するnewHelperようにします。 「2つの方法で述べる」必要があります。

于 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 に答える