我应该如何使用番石榴TypeToken反射性地实例化参数化类型?

时间:2012-06-29 13:14:09

标签: java reflection guava

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

1 个答案:

答案 0 :(得分:0)

这没关系 - 参数化类型使用type erasure进行编译,因此参数信息在运行时不可用。

在运行时,Class<Base<T>> == Class<Base<Integer>> == Class<Base<Double>>等,因此rawType变量引用的类对象足以实例化该类。