我对通用列表有问题。我花了几个小时寻找解决方案,而我能做的最好的是在下面。这是我的代码:
private <T extends SonarContainPaging> T getSonarObjectFromPage(String url, Map<String, Object> uriVariables, Class<T> klass, int page) {
String json = //create the Json
return objectMappingFromJson(json, klass);
}
private <T extends SonarContainPaging> void getSonarListContainingPaging(String url, Map<String, Object> uriVariables, Class<T> klass, List<T> list) {
int page = 1;
SonarContainPaging sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);
page++;
list.add(sonarObject);
while (sonarObject.canContinueLooping(page)) {
sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);
page++;
list.add(sonarObject);
}
}
方法objectMappingFromJson
调用gson.fromJson(json, classOfObject);
并返回通用对象T
。
当我尝试在列表中添加对象sonarObject
时,出现以下错误:
列表类型中的add(T)方法不适用于参数(SonarContainPaging)
我认为将sonarObject
转换为类型(T)
将解决此问题。但这很奇怪。
我声明了<T extends SonarContainPaging>
,但不知道为什么会出现此错误。
编辑: 就像@Andy Turner告诉我的那样,我将方法更改为:
private <T extends SonarContainPaging> void getSonarListContainingPaging(String url, Map<String, Object> uriVariables, Class<T> klass,
List<? super SonarContainPaging> list);
解决了在列表中添加对象的问题。 但它又创造了一个:
List<SonarComponentTree> list = new ArrayList<SonarComponentTree>();
getSonarListContainingPaging(urlBuilder.toString(), uriVariables, SonarComponentTree.class, list);
我无法使用列表getSonarListContainingPaging
调用方法SonarComponentTree
。
SonarComponentTree
实现SonarContainPaging
。
The method getSonarListContainingPaging(String, Map<String,Object>, Class<T>, List<? super SonarContainPaging>)
in the type SonarRestApiServiceImpl is not applicable for the arguments
(String, Map<String,Object>, Class<SonarComponentTree>, List<SonarComponentTree>)
如果我将list参数改回List<? extends SonarContainPaging> list
,则问题已解决,但我又回到了开始的位置。
我不能在列表中添加另一个对象。
我在@Andy Turner提供的链接中阅读了@Michael Myers解决方案,看来我既不应该使用extends
也不应该使用super
,实际上,这可能是概念错误。
最终编辑:
第一个答案实际上有效,您只需要将对象强制转换为(T)sonarObject
。
您只需要承担警告。