2015-01-09 137 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

(以原始類型轉換爲一個帶通配符參數)。

的原因是,一般類型(並且具體地,通配符)是一種比類類型不同,並且不能與類類型的工具來表示。

相關問題