1

私のクラスTypeRegistererを使用すると、クライアントはパラメーター化された型を(TypeRegistererと同じパラメーターで)登録し、生の型名を使用してそれらをインスタンス化できます。

私の現在の解決策は機能しますが、チェックされていないキャスト警告があり、無視しても安全かどうかわかりません。これを行うためのより良い方法はありますか?

public class TypeRegisterer<T> {
    private Map<String, TypeToken<? extends Base<T>>> registeredTypes;

    public void registerType(TypeToken<? extends Base<T>> typeToken) {
        registeredTypes.put(typeToken.getRawType().getSimpleName(), typeToken);
    }

    public Base<T> initType(String className, T feature) throws Exception {
        // validation and exception handling removed for brevity
        TypeToken<? extends Base<T>> ruleType = registeredTypes.get(className);

        @SuppressWarnings("unchecked")
        Class<? extends Base<T>> rawType = (Class<? extends Base<T>>) ruleType .getRawType();

        return rawType.getConstructor().newInstance();
    }
}
4

1 に答える 1

0

これは問題ありません - パラメータ化された型は型 eraseでコンパイルされるため、パラメータ情報は実行時に利用できません。

実行時など、変数Class<Base<T>> == Class<Base<Integer>> == Class<Base<Double>>によって参照されるクラス オブジェクトは、クラスをインスタンス化するのに十分です。rawType

于 2012-06-29T13:21:04.383 に答える