2015-11-01 83 views
4

我有以下的實用工具類:這爲什麼不安全?

public class MyUtils{ 

    public static <T> List<? extends T> getList(Class<T> clazz){ 
     //returning some list 
    } 
} 

和使用該方法的類:

public class MyClass<T>{ 

    public static List<MyClass<?>> values(){ 
     return (List<MyClass<?>>) MyUtils.getList(MyClass.class); //Warning, unchecked cast. 
    } 
} 

這是爲什麼不投保險目前還不清楚?該方法的結果不能被分配給一個變量是這樣的:

List<MyClass<? extends Integer>> lst = MyClass.values(); //compile-error 

,我們可以分配方法的結果的唯一方法是這樣的:

List<MyClass<?>> dsss = MyClass.values(); 

那麼,什麼樣的運行時錯誤的可能會有這樣的演員導致?

+0

'MyClass.getList'應該是'MyClass.values',對吧? – CoronA

+0

@CoronA Excatly,我會在一分鐘內解決。 –

+0

@CoronA完成... –

回答

4

getList()返回一個列表未知類型。你將它投射到List<MyClass<?>>。它怎麼會安全?

假設返回的列表是List<MyFirstSubClassOfMyClass>。在將它鑄造到List<MyClass<?>>之後,您可以將MyClass的實例添加到列表中,但該列表應該只包含MyFirstSubClassOfMyClass的實例。

+0

啊,我明白了。所以施放的安全性依賴於'getList(Class clazz)'的實現。我的意思是,如果它的執行如下'public static List getList(Class clazz){List lst = new ArrayList <>(); //等返回lst;}'警告可以被安全地消除,對吧? –

+1

如果這是實現,則可以禁止該警告,並且在運行時不會有問題。但是這違背了使用類型安全的泛型類型的觀點。如果您的方法應始終返回列表,則其返回類型應爲列表,而不是列表。 –

+0

如果它總是返回'List ',則鑄造'(List >)MyUtils.getList(MyClass.class)'將產生編譯錯誤'不能從列表到列表>'。這就是爲什麼我把它列入'List '。也許還有另一種方式來處理這些事情......我只是不知道。 –

相關問題