java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为
我在(MyClassAttributes mc:atList)处获得java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为,java,Java,我在(MyClassAttributes mc:atList)处获得java.lang.ClassCastException:[Ljava.lang.Object;无法转换为…model.MyClassAttributes异常,即使我对实体进行了转换 List<MyClassAttributes> atList = new ArrayList<MyClassAttributes>(); atList=(List<MyClassAttributes>)sessi
java.lang.ClassCastException:[Ljava.lang.Object;无法转换为…model.MyClassAttributes
异常,即使我对实体进行了转换
List<MyClassAttributes> atList = new ArrayList<MyClassAttributes>();
atList=(List<MyClassAttributes>)session.createSQLQuery(SELECT_QR_SQL).setLong("rec", rec).list();
for(MyClassAttributes mc : atList)
{
}
这里有什么问题吗?你能试试这个吗?
不要初始化列表对象,只需声明它
例如
列表目录;
强制转换不起作用的原因是-您有一个List
实例,其中有一个ArrayList
对象。而sqlQuery.List()
函数正在返回一个List
仅当满足“is-a”关系时,强制转换才起作用
ArrayList
is-a(总是)List
。因此您可以将ArrayList
实例强制转换为List
。但是List
可能并非始终是ArrayList
。因此强制转换不起作用。Java在运行时不知道任何泛型。这称为“类型擦除”。因为List()
方法已经返回了一个列表
,将其键入其他列表
(其中B
是a
的子类)不会生成任何附加字节码
请注意
ClassCastException
如何出现在for
循环中,而不是赋值中。使用循环变量,您(以及编译器,因为您以前进行了强制转换)假设列表
只包含null
和MyClassAttributes
对象,但显然不是这样,因为抛出了异常。session.createSQLQuery返回什么?从某个表中选择col1,col2,其中col3=:some\val
-返回对象列表尝试将其转换为正常列表,而不使用泛型。它只返回一个简单的列表。如果您立即用另一个调用的结果替换它,那么分配一个新的ArrayList
有什么意义呢?是的,这是多余的,但不应该是实际问题的一部分。但是当然,局部变量的初始化应该被删除,因为它是无意义的。实际上,它不可能t在分配其他变量之前,分配给atList
变量的是什么。尤其是变量的值不会影响任何不相关的类型转换。ClassCastException
确实表明列表不包含MyClassAttributes
对象,至少不是唯一的。
atList = session.createSQLQuery("Select col from....").setLong("rec", rec.longValue()).list();
List<MyClassAttributes> atList;