简体   繁体   English

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

[英]How should I reflectively instantiate a parametrized type using guava TypeToken?

My class TypeRegisterer allows a client to register parameterized types (with the same parameter as TypeRegisterer) and then instantiate them by using their raw type name. 我的类TypeRegisterer允许客户端注册参数化类型(使用与TypeRegisterer相同的参数),然后使用其原始类型名称实例化它们。

My current solution works but I have an unchecked cast warning and I'm not sure whether it's safe to ignore. 我当前的解决方案有效,但是我有一个未经检查的强制转换警告,并且不确定是否可以忽略。 Is there a better way to do this? 有一个更好的方法吗?

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

This is OK - parameterized types are compiled with type erasure , so the parameter information isn't available at runtime. 没关系-参数化类型是使用类型erasure编译的,因此参数信息在运行时不可用。

At runtime, Class<Base<T>> == Class<Base<Integer>> == Class<Base<Double>> etc, so the class object referenced by your rawType variable is sufficient to instantiate the class. 在运行时, Class<Base<T>> == Class<Base<Integer>> == Class<Base<Double>>等,因此rawType变量引用的类对象足以实例化该类。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM