如何将List<SomeParamType>转换为List<SomeParamType<?>>?

8
在使用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个回答

3

实际上不是转换,而是一个程序,可以在没有警告的情况下构建所需类型的列表:

public List<Generator<?>> solution() {
    List<Generator<?>> dst = new ArrayList<>();
    for (Generator<?> g : getBeansOfType(Generator.class).values()) {
        dst.add(g);
    }
    return dst;
}

1
但这明显会在 Generator g 上产生“原始类型”警告。你可以在 Eclipse 中禁用该警告,但那不是我的目标。 - Marko Topolnik
我认为这更像是一个谜题,而不是真实世界的需求。@SuppressWarning 是唯一的方法,没有库支持的话(getBeansOfType 应该与适用于类型标记的方法配对使用)。 - Raffaele
有趣,我没有收到任何警告。你收到了什么警告?也许这是IntelliJ特有的警告? - Marko Topolnik
标准的javac 输出源代码 - Raffaele
我不会使用那些词,因为它们包含了两个规则,而一个已经足够了。Generator是一个原始类型,可以安全地转换为Generator<?>List<Generator>不是原始类型,这就是为什么转换是非法的原因。 - Raffaele
显示剩余10条评论

1
我想这是不可能的(将原始类型转换为带有通配符参数的类型)。
原因是,泛型类型(特别是通配符)与类类型不同,不能用类类型的工具表示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接