2013-03-25 211 views
0

有一個方法:泛型擴展

protected List<? extends Object> retrieveData(TypeReference<List<? extends Object>> ref) 

當我嘗試應用它:

return (List<SomeClass>) retrieveData(new TypeReference<List<SomeClass>>() {}); 

我得到這個通知

在 型AbstractJsonService方法retrieveData(TypeReference<List<? extends Object>>)不適用於參數(new TypeReference<List<SomeClass>>(){})

不知道這裏有什麼問題。有什麼建議麼?

回答

1

Not sure what's wrong here. Any suggestions?

類型<? extends Object>是在方法體中未知的,這種類型可能是List<SomeClass>或不是一個實例。編譯器無法確定地知道並阻止返回List<SomeClass>

使用protected <T> T retrieveData(TypeReference<T> ref)時,對於T有一個「固定」類型,編譯器確切知道返回類型與TypeReference的類型相同。除此之外,編譯器能夠在調用方法時推斷出類型T爲List<SomeClass>retrieveData(new TypeReference<List<SomeClass>>),不需要再執行List<SomeClass>強制轉換。

3

也許你可以試試下面的方法簽名:

protected <E> E retrieveData(TypeReference<E> ref) 
+0

它似乎在工作 - 你能解釋它爲什麼有效,爲什麼我的方法失敗了? – midnight 2013-03-25 09:38:07

+0

你可以使用這個定義:protected > E retrieveData(TypeReference ref)這將強制E至少成爲一個List – Thierry 2013-03-25 09:53:33