如何修复 'Unchecked cast from MyClass to T'

How to fix 'Unchecked cast from MyClass to T'

我有一个有效的方法,但请警告我,是否有任何解决方案可以彻底删除它?


警告:

Type safety: Unchecked cast from SonarContainPaging to 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 对象无法从其父级调用方法。

解决方案是在此处使用 T 作为类型,然后您可以删除您的强制转换:

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

由于根据您的评论,getSonarObjectFromPage returns T,其中 T 是您传入的 class:

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

在这种情况下,您传递了 class klass,这是一个 Class<T>,因此 getSonarObjectFromPage 将 return 一个 T 作为嗯

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

首先是将对象转换为class:

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;
}

正如 Sweeper 在 中提到的,您只需将 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));
}

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

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