2015-01-09 93 views
8

使用Spring ApplicationContext及其方法getBeansOfType我遇到了泛型类型的问题。这表明问题:如何实现从List <SomeParamType>到List的转换<SomeParamType <?>>

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<?>,并使用自定义逻辑根据每个实例的属性安全地转换为相应的类型参数。

我的问题是,我找不到任何方式分配到allGenerators没有类型安全警告,即使在概念层面上,我没有承诺任何未检查的类型参数。我只想将原始类型转换为通配符类型。

有没有什么成语不需要@SuppressWarnings去那里?

回答

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中禁用该警告,但这不是我想要的。 –

+0

@MarkoTopolnik如果我使用'Generator '作为'g'的类型(至少代码编译并且我没有收到任何警告),似乎可以。 – Raffaele

+0

您必须在编译器设置中启用-Xlint:unchecked IntelliJ查看警告,或者在启用此设置的情况下手动编译它。 –

1

(以原始类型转换为一个带通配符参数)。

的原因是,一般类型(并且具体地,通配符)是一种比类类型不同,并且不能与类类型的工具来表示。

相关问题