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