猿问

如何修复“从 MyClass 到 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对象无法从其父对象调用方法。


忽然笑
浏览 249回答 4
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。

偶然的你

通常有两种方法可以避免此警告。首先是将对象转换为类:public static <T> T castMe(Class<T> clazz, Object object) {&nbsp; &nbsp; return clazz.cast(object);}第二个是用注释抑制警告。这是一种不确定的方式,但是当您绝对知道可以将特定对象强制转换为相关泛型类型时,可以安全地使用它:@SuppressWarnings("unchecked")public static <T> T castMe(Class<T> clazz, Object object) {&nbsp; &nbsp; 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) {&nbsp; &nbsp; int page = 1;&nbsp; &nbsp; T sonarObject;&nbsp; &nbsp; do {&nbsp; &nbsp; &nbsp; &nbsp; sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);&nbsp; &nbsp; &nbsp; &nbsp; list.add(sonarObject);&nbsp; &nbsp; } while (sonarObject.canContinueLooping(++page));}

眼眸繁星

您可以使用强制转换方法。&nbsp;https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#cast-java.lang.Object-list.add(klass.cast(sonarObject));
随时随地看视频慕课网APP

相关分类

Java
我要回答