簡體   English   中英

如何解決'從MyClass到T'的未經檢查的強制轉換

[英]How to fix 'Unchecked cast from MyClass to T'

我有一個有效的方法,但是給我一個警告,是否有任何解決方案可以徹底刪除它?

  • 在這個方法中我調用方法:
    <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對象無法從其父級調用方法。

解決方案是在這里使用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)

在這種情況下,您傳遞了類klass ,它是一個Class<T> ,因此getSonarObjectFromPage也將返回一個T

正如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));
}

一般來說,有兩種方法可以避免此警告。

第一種是將對象強制轉換為類:

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM