Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类型安全:未选中从对象到列表的强制转换_Java_Generics - Fatal编程技术网

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

Java 类型安全:未选中从对象到列表的强制转换,java,generics,Java,Generics,//一些代码 SqlOutParameter out = new SqlOutParameter("out_refcursor",OracleTypes.CURSOR ,new StudentRowMapper()); 执行存储过程并返回输出参数的映射,按参数声明中的名称键入 上一行的警告:List students=(List)result.get(“out_refcursor”)是:

//一些代码

SqlOutParameter out = new SqlOutParameter("out_refcursor",OracleTypes.CURSOR
                                           ,new StudentRowMapper());
执行存储过程并返回输出参数的映射,按参数声明中的名称键入

上一行的警告:
List students=(List)result.get(“out_refcursor”)是:

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

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

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

  • 我试过的一种方法是

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

  • 欢迎您提供任何建议。

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

    第一种方法在实践中可能有效,但实际上有点不可靠。在Java中,对泛型类型进行子分类和对其参数进行子分类之间存在着细微(但巨大)的区别,即
    ArrayList
    不是
    ArrayList
    的子类,而是
    ArrayList
    集合的子类型:请参阅。更正式的计算机科学背景


    因此,在我看来,您应该将强制转换保留在那里,保留(必要的)注释,并捕获
    ClassCastException
    ,以确保涵盖异常(因此得名)情况。

    您的第二个解决方案不会有任何帮助(由于),并且也会导致其他问题,因此可能不是一个好主意

    第一种方法在实践中可能有效,但实际上有点不可靠。在Java中,对泛型类型进行子分类和对其参数进行子分类之间存在着细微(但巨大)的区别,即
    ArrayList
    不是
    ArrayList
    的子类,而是
    ArrayList
    集合的子类型:请参阅。更正式的计算机科学背景


    因此,在我看来,您应该将强制转换保留在那里,保留(必要的)注释,并捕获
    ClassCastException
    ,以确保涵盖异常(因此命名)情况。

    这样的事情可以行得通,只要您知道
    列表中元素的类名。这里有一个问题,硬编码的
    ArrayList
    实例化

    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;
     }
    
    公共静态列表castList(对象对象,类clazz)
    {
    列表结果=新建ArrayList();
    if(obj实例列表)
    {
    对于(对象o:(列表)对象j)
    {
    结果.添加(分层铸造(o));
    }
    返回结果;
    }
    返回null;
    }
    
    用法:

    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 students=castList(result.get(“out_refcursor”)、Student.class);
    
    只要知道
    列表中元素的类名,类似的东西就可以工作。这里有一个问题,硬编码的
    ArrayList
    实例化

    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;
     }
    
    公共静态列表castList(对象对象,类clazz)
    {
    列表结果=新建ArrayList();
    if(obj实例列表)
    {
    对于(对象o:(列表)对象j)
    {
    结果.添加(分层铸造(o));
    }
    返回结果;
    }
    返回null;
    }
    
    用法:

    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 students=castList(result.get(“out_refcursor”)、Student.class);
    
    如果您知道返回的值是一个
    列表,您就可以了。如果您知道它将始终返回列表,那么第一种方法也可以。如果您不确定它将返回什么,那么您应该使用第三种方法……我知道它将始终返回
    列表
    ,因此在这种情况下,使用@superswarnings(“未选中”)是干净的编码?第三种方法也可以避免警告,但是我觉得代码太多了如果你知道返回的值是一个
    列表
    ,你很好。第一种方法很好,如果你知道它将始终返回列表,如果你不确定它将返回什么,你应该使用第三种方法…我知道它将始终返回
    列表
    ,那么,在这种情况下使用@SupersWarnings(“未选中”)是干净的编码吗?第三种方法也可以避免警告,但我觉得太多了,谢谢你提供的所有参考资料。但是我怎样才能将它保持为
    列表
    ,因为
    result.get(“out_refcursor”)
    返回一个
    对象
    而不是对象列表。对了,误解了,抱歉。我认为,您最好立即将其强制转换到
    列表
    ,并在调用中直接保留注释(可能会对其安全性进行注释),因为其他方法不会使其更安全,也不会删除警告。如果您愿意,您可以随时捕获
    ClassCastException
    并处理实际的错误情况……感谢您提供的所有参考资料。但是我怎样才能将它保持为
    列表
    ,因为
    result.get(“out_refcursor”)
    返回一个
    对象
    而不是对象列表。对了,误解了,抱歉。我认为,您最好立即将其强制转换到
    列表
    ,并在调用中直接保留注释(可能会对其安全性进行注释),因为其他方法不会使其更安全,也不会删除警告。如果您愿意,您可以随时捕获
    ClassCastException
    并处理实际错误情况…+1表示该泛型
    castList()
    表示我的理解+1表示该泛型
    castList()
    表示我的理解
    List<Student> students = castList(result.get("out_refcursor"), Student.class);