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);