2015-11-17 2 views
0

Я получаю исключение java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to ...model.MyClassAttributes в for(MyClassAttributes mc : atList), даже если я сделал приведение к сущности.java.lang.ClassCastException: [Ljava.lang.Object; не может быть отлит до

List<MyClassAttributes> atList = new ArrayList<MyClassAttributes>(); 
atList=(List<MyClassAttributes>)session.createSQLQuery(SELECT_QR_SQL).setLong("rec", rec).list(); 
for(MyClassAttributes mc : atList) 
{ 

} 

Когда я проверил скомпилированный класс, кажется, что он не обновил.

atList = session.createSQLQuery("Select col from....").setLong("rec", rec.longValue()).list(); 

В чем проблема?

+0

Что возвращает session.createSQLQuery? –

+0

'select col1, col2 from some_table где col3 =: some_val' - возвращает список объектов – NaaN

+0

Попробуйте перевести его в обычный список без дженериков. Он просто возвращает простой список. [Нажмите здесь] (http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate/3.2.4.sp1/org/hibernate/Query.java#Query.list%28%29) –

ответ

-1

Можете ли вы попробовать это? Не инициализируйте объект List. Просто объявить его например -

List<MyClassAttributes> atList; 

Причина литая не работает - вы есть List экземпляр с ArrayList объекта в нем. И функция sqlQuery<>.list() возвращает List.

Каста работает только тогда, когда отношения «есть-а» выполнены.

ArrayList есть-a (всегда) List. Таким образом, вы можете сделать экземпляр ArrayList как List. Но List может не быть ArrayList все время. Так что актер не работает.

+0

На самом деле, не имеет значения, что было назначено переменной 'atList', прежде чем назначать что-то еще. В частности, значение переменной не влияет на какое-либо несвязанное приведение типов. «ClassCastException» действительно говорит о том, что список не содержит объектов MyClassAttributes, по крайней мере, не исключительно. – Wormbo

0

Java не знает никаких дженериков во время выполнения. Это называется стиранием типа. Так как метод list() уже возвращает List<A>, приписывая его некоторому другому List<B> (где B является подклассом A) не генерирует дополнительный байт-код.

Обратите внимание, что ClassCastException встречается в цикле for, а не в задании. С переменной цикла вы (а также компилятор, так как вы забросили ранее), предположите, что List содержит только null и MyClassAttributes объектов, но, по-видимому, это не так, поскольку исключение выбрано.