如何实现从List <someparamtype>到List <someparamtype <?>&gt; </someparamtype <?> </someparamtype>的转换

时间:2015-01-09 10:30:17

标签: java generics

在使用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到达那里?

2 个答案:

答案 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)

我认为这是不可能的(将原始类型转换为带有通配符参数的类型)。

原因是泛型类型(特别是通配符)与类类型不同,不能用类类型的工具表示。