在使用Spring ApplicationContext及其方法getBeansOfType
时,我遇到了泛型类型的问题。这证明了这个问题:
class Test
{
List<Generator<?>> allGenerators =
new ArrayList(getBeansOfType(Generator.class).values()); // Raw type warning
// for new ArrayList()
<T> Map<String, T> getBeansOfType(Class<T> klass) {
return emptyMap();
}
}
interface Generator<R> {}
我从容器中检索参数化类型的所有bean。我希望将它们设置为Generator<?>
并使用自定义逻辑根据每个Generator
实例上的属性安全地转换为相应的类型参数。
我的问题是,在没有类型安全警告的情况下,我找不到任何分配给allGenerators
的方法,即使在概念层面上我没有提交任何未经检查的类型参数。我只想将原始类型转换为通配符类型。
是否有任何成语不需要@SuppressWarnings
到达那里?
答案 0 :(得分:3)
实际上不是转换,而是在没有警告的情况下构建所需类型列表的程序:
public List<Generator<?>> solution() {
List<Generator<?>> dst = new ArrayList<>();
for (Generator<?> g : getBeansOfType(Generator.class).values()) {
dst.add(g);
}
return dst;
}
答案 1 :(得分:1)
我认为这是不可能的(将原始类型转换为带有通配符参数的类型)。
原因是泛型类型(特别是通配符)与类类型不同,不能用类类型的工具表示。