我有一个可行的方法,但警告我,是否有任何解决办法可以干净地删除它?
在此方法中,我称该方法为:
<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
对象无法从其父对象调用方法。
答案 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)
在这种情况下,您传递了klass
类Class<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));