为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复“从 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 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信