java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为

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

我在(MyClassAttributes mc:atList)处获得
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;