如何修复“从MyClass到T的未经检查的演员表”

时间:2019-05-28 08:36:03

标签: java list generics warnings

我有一个可行的方法,但警告我,是否有任何解决办法可以干净地删除它?

  • 在此方法中,我称该方法为:
    <T extends SonarContainPaging> T getSonarObjectFromPage(String url, Map<String, Object> uriVariables, Class<T> klass, List<T> page)
    返回一个扩展SonarContainPaging的对象。

  • 我尝试添加一个将SonarContainPaging扩展到我的列表的对象,但出现警告。

  • SonarContainPaging对象具有方法canContinuePaging,该方法采用页整数并返回布尔值。


警告:

  

类型安全:从SonarContainPaging到T的未经检查的转换

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((T)sonarObject); // Warning
    while (sonarObject.canContinueLooping(page)) {
        sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);
        page++;

        list.add((T) sonarObject); // Warning
    }
}

您能想到的任何解决方案吗?


@Sweeper提供的解决方案是将sonarObject的类型更改为T
我犯的错误是假设通用T对象无法从其父对象调用方法。

4 个答案:

答案 0 :(得分:2)

解决方案是在此处使用T作为类型,然后可以删除演员表:

// before:
// SonarContainPaging sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);
// after:
T sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);

根据您的评论,getSonarObjectFromPage返回T,其中T是您将其传递给的类:

<T extends SonarContainPaging> T getSonarObjectFromPage(String url, Map<String, Object> uriVariables, Class<T> klass, List<T> page)

在这种情况下,您传递了klassClass<T>,因此getSonarObjectFromPage也将返回T

答案 1 :(得分:1)

如Sweeper在their answer中所提到的,您可以将sonarObject的类型更改为T

T sonarObject;

您还可以使用do-while循环来改善代码,以减少冗余:

private <T extends SonarContainPaging> void getSonarListContainingPaging(String url, Map<String, Object> uriVariables, Class<T> klass, List<T> list) {
    int page = 1;
    T sonarObject;
    do {
        sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);
        list.add(sonarObject);
    } while (sonarObject.canContinueLooping(++page));
}

答案 2 :(得分:0)

通常有两种方法可以避免此警告。

首先是将对象转换为类:

public static <T> T castMe(Class<T> clazz, Object object) {

    return clazz.cast(object);
}

第二个是通过注释禁止显示警告。对此尚不确定,但是当您完全知道特定对象可以转换为所讨论的泛型类型时,可以安全地使用它:

@SuppressWarnings("unchecked")
public static <T> T castMe(Class<T> clazz, Object object) {

    return (T) object;
}

答案 3 :(得分:0)

您可以使用强制转换方法。 https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#cast-java.lang.Object-

list.add(klass.cast(sonarObject));