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

类型安全:从对象到列表的未选中强制转换

丌官运珧
2023-03-14
SqlOutParameter out = new SqlOutParameter("out_refcursor",OracleTypes.CURSOR
                                           ,new StudentRowMapper());

//一些代码...

MapSqlParameterSource parameters = createMapSqlParameterSource();
parameters.addValue("in_studentid","101"); 

Map<String, Object> result = simpleJdbcCall.execute(parameters);
List<Student> students = (List<Student>) result.get("out_refcursor"); // here I get a warning

执行()方法的定义:

Map<String, Object> org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SqlParameterSource parameterSource)

执行存储过程并返回输出参数的映射,按名称键入,如参数声明中所示

上面一行的警告:List

类型安全:从对象到列表的未选中强制转换

我知道这只是一个编译时警告,当然我可以做一个SuppressWarnings(“unchecked”)来抑制它。

问题:但我如何正确地施放它呢?

>

  • 我尝试的一种方法是

    List<Student> students = castObject( result.get("out_refcursor"));
    
    @SuppressWarnings("unchecked")
        private static <T extends List<?>> T castObject(Object obj){
        return (T)obj;
    }
    

    不过,我还是必须在castObject()方法中放入SuppressWarnings(“unchecked”)。我不知道这样做是否正确。

    我尝试的第二种方法是,

    List<?> students = castObject( result.get("out_refcursor"));
    
    Student student = (Student)students.get(0);
    
    private static <T extends List<?>> List<?> castObject(Object obj){
          if(obj instanceof List<?>) {
               return (List<Student>)obj;
          }
          return null;
     }
    

    欢迎提出任何建议/建议。

  • 共有2个答案

    郭鸿信
    2023-03-14

    您的第二个解决方案不会有帮助(由于类型擦除),而且还会导致其他问题,因此可能不是一个好主意。

    第一种方法可能在实践中有效,但实际上有点不可靠。在泛型类型子类化和在Java中子类化它们的参数之间有一个微妙(但巨大)的区别-即ArrayList

    因此,在我看来,您应该将强制转换保持在那里,保留(必要的)注释,并捕获类CastException,以确保覆盖例外情况(因此得名)。

    陶温书
    2023-03-14

    只要您知道List元素的类名,这样的东西就可以工作。这里的一个问题是硬编码的ArrayList实例化。

    public static <T> List<T> castList(Object obj, Class<T> clazz)
    {
        List<T> result = new ArrayList<T>();
        if(obj instanceof List<?>)
        {
            for (Object o : (List<?>) obj)
            {
                result.add(clazz.cast(o));
            }
            return result;
        }
        return null;
    }
    

    用法:

    List<Student> students = castList(result.get("out_refcursor"), Student.class);
    
     类似资料:
    • 下面是程序的一部分,它将ArrayList从服务器发送到客户端。我想删除关于此代码最后一行的警告: 客户端代码: MyVariable是一个具有一些属性的Java类。服务器正在创建一个ArrayList并用MyVariable变量作为项目填充它。然后它将完整的列表发送给客户端。 我想知道为什么我在那里有一个警告,以及如何完美地编码以获得0个警告。如果可能,我希望避免使用“@SuppressWarn

    • 我有这样一种方法,将结果强制转换到(列表),但我的eclipse仍然在抱怨!类型安全:未选中从列表到列表的强制转换

    • 我有一个通用类。它看起来像这样: 显然,conevertdatajsonstring方法仅在字符串类型为T时调用。但有一个警告: 类型安全:未选中从字符串转换为T 有没有一种方法可以在不使用SuppressWarnings的情况下解决此问题: @抑制警告(“未选中”) 方法之前?

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

    • 问题内容: 我尝试将一个对象强制转换为我的Action类,但是会导致警告: 感谢您的任何帮助 问题答案: 是的- 这是类型擦除的自然结果。如果确实是if 的实例,则强制转换不会捕获该实例-您只会在尝试使用它时才看到问题,传入a 而不是字符串。 您可以使用以下方法消除警告: 作为功​​能注释,但您不能轻松地解决潜在的问题:(

    • 对API控制器的远程调用(通过RestTemboard)(从一侧返回已知对象的List([]),从远程侧返回未知类型的对象)返回