亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復“從 MyClass 到 T 的未經檢查的轉換”

如何修復“從 MyClass 到 T 的未經檢查的轉換”

忽然笑 2022-12-21 11:54:32
我有一個有效的方法,但請給我一個警告,是否有任何解決方案可以徹底刪除它?在此方法中,我調用方法:<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 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

解決方案是在此處使用Tas 類型,然后您可以刪除您的演員表:


// before:

// SonarContainPaging sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);

// after:

T sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);

由于根據您的評論,getSonarObjectFromPagereturns T,T您傳遞給它的類在哪里:


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

在這種情況下,您傳遞了 class klass,它是 a Class<T>,因此getSonarObjectFromPage也會返回 a T。


查看完整回答
反對 回復 2022-12-21
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

通常有兩種方法可以避免此警告。


首先是將對象轉換為類:


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;

}


查看完整回答
反對 回復 2022-12-21
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

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

}


查看完整回答
反對 回復 2022-12-21
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

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

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


查看完整回答
反對 回復 2022-12-21
  • 4 回答
  • 0 關注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號