2013-03-25 170 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