Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该如何使用guava TypeToken反射地实例化参数化类型?_Java_Reflection_Guava - Fatal编程技术网

Java 我应该如何使用guava TypeToken反射地实例化参数化类型?

Java 我应该如何使用guava TypeToken反射地实例化参数化类型?,java,reflection,guava,Java,Reflection,Guava,我的类TypeRegisterer允许客户端注册参数化类型(使用与TypeRegisterer相同的参数),然后使用它们的原始类型名实例化它们 我目前的解决方案有效,但我有一个未经检查的强制转换警告,我不确定忽略它是否安全。有更好的方法吗 public class TypeRegisterer<T> { private Map<String, TypeToken<? extends Base<T>>> registeredTypes;

我的类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();
    }
}
公共类类型注册器{

私有映射这是可以的-参数化类型是用编译的,因此参数信息在运行时不可用


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

Ah,因此我可以使用Class而不是TypeToken,但这会将强制转换移动到注册方法并添加raw type警告,因此这可能更好。您所做的是危险。假设您从未键入错误的类名,假设没有两个具有相同简单名称的类扩展
Base
,等等,它会起作用。我至少会检查这些情况。并且可能会在这里删除
TypeToken
,因为您实际使用的是
。类似
initType的方法
始终返回“正确的事情”很少是正确的。类名是从数据库加载的,所以我并不担心拼写错误,因为我用其他方法指定要使用的类时也会遇到同样的问题。我确实检查了该类是否存在,但为了简洁起见将其删除,我会对此发表评论。我更乐意使用类f或者注册,但是我被rawType警告和unchecked cast警告劝阻了,但是看看它,至少它看起来更明显,那里发生了什么,所以我会改变它-谢谢@maaartinus