将subClass对象添加到List <!-?扩展子类->创建错误

时间:2019-05-07 11:41:55

标签: java generics gson

我对通用列表有问题。我花了几个小时寻找解决方案,而我能做的最好的是在下面。这是我的代码:

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。 您只需要承担警告。

0 个答案:

没有答案