2013-05-13 15 views
6

我從與此簽名庫中調用一個方法:如何在調用接受類<T>的泛型方法時返回某種類型的列表並返回T?

public <T> T get(Class<T> c) 

而且我想獲得一個List<MyClass>作爲返回值。但調用它像這樣不會編譯(「無法從參數化類型中選擇」):

List<MyClass> myClasses = get(List<MyClass>.class); 

這編譯,但會發出警告:

List<MyClass> myClasses = get(List.class); 

警告說:「未分配」。我如何避免此警告並避免投射我的名單?

回答

3

您在此處使用泛型,因此列表中項目的基礎類型已在運行時擦除,並且編譯器知道它無法在編譯時爲您檢查,因此出現警告。如果您在這裏使用泛型,您將無法避免該警告。如果你確定你正在做的演員不會導致異常,你可以壓制它。

@SuppressWarnings("unchecked") 
1

:我張貼此多爲興趣點比作爲推薦答案。簡單地壓制警告通常會更好。

如果你真的很討厭抑制警告,但你也討厭看到的警告,那麼接受的答案就有一個很好的選擇。您可以實例化一個原型對象,如ArrayList<MyClass>,然後將archetype.getClass()傳遞到泛型方法,而不是List.class,如示例和接受的答案中所做的。

這看起來像:

ArrayList<MyClass> archetype = new ArrayList<>(); 
List<MyClass> myClasses = get(archetype.getClass()); 

一個明顯的缺點,這裏是實例化對象原型的不必要的成本,但是,這在某種程度上將使其成爲一個靜態實例來緩解。按照我的估計,一個更大的缺點是你必須使用具體的類作爲你的原型,這可能是不必要的限制。