当前位置: 首页 > 知识库问答 >
问题:

如何修复“从MyClass到T的未检查强制转换”

谈炳
2023-03-14

我有一个有效的方法,但给我一个警告,有没有什么解决方案可以干净地删除它?

>

  • 在这个方法中,我调用以下方法:

    我试图将一个扩展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对象无法从其父对象调用方法。


  • 共有3个答案

    谢善
    2023-03-14

    正如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));
    }
    
    利永年
    2023-03-14

    通常有两种方法可以避免此警告。

    第一个是将对象强制转换到类:

    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;
    }
    
    夹谷苗宣
    2023-03-14

    解决方案是在此处使用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,这是一个类

     类似资料:
    • 我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?

    • 我的代码:-文件1。JAVA File2.java(catlisting_xpath元素的XPATH) 错误:- JAVAlang.ClassCastException:类组织。openqa。硒。遥远的RemoteWebElement不能转换为java类。util。列表(org.openqa.selenium.remote.RemoteWebElement位于加载器“app”的未命名模块中;jav

    • 我正在做一个java项目,我遇到了这个问题,不知道如何修复它。 } 当我尝试运行该程序时,它给出了错误: 线程“main”java.lang.ClassCastException中出现异常:无法将Stock强制转换为java.lang.Comparable 有人知道怎么了吗?

    • 完全错误: 用户类: 导致此错误的实现:

    • 问题内容: 请帮忙,我在以下代码中收到以下消息: PuntoNota.java AdapterDatos: 该应用程序运行良好,但是我收到以下消息: 未经检查的强制转换:从’java.io.Serializable’到’java.util.ArrayList’更少…(Ctrl + F1)。 关于此代码:(ArrayList)getIntent()。getSerializableExtra(“ my

    • 问题内容: 在我的spring应用程序上下文文件中,我有类似以下内容: 在java类中,实现如下所示: 在Eclipse中,我看到一条警告: 类型安全性:未经检查的从Object到HashMap的转换 我做错了什么?我该如何解决该问题? 问题答案: 好吧,首先,你正在通过新的HashMap创建调用浪费内存。你的第二行完全忽略了对此创建的哈希图的引用,从而使该哈希图可用于垃圾收集器。因此,不要这样做