[英]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.