исключение приведения класса: java.lang.String несовместимо с [Ljava.lang.Object; - PullRequest
2 голосов
/ 17 ноября 2011

Что не так с кодом ниже?

List<Object[]> currencies = null;
List<String> currencyList = new ArrayList<String>();

//code to fetch currency
String currencySql = "select C.Currency from Currency C";
Query currencyQuery = this.em.createQuery(currencySql);

currencies = currencyQuery.getResultList();

for (Object[] currency : currencies) {    //getting runtime error here
   for (int i = 0; i < currency.length; i++) {
            currencyList.add(currency[i].toString());
        }
    }

Получение ошибки времени выполнения в первой строке цикла for как: java.lang.ClassCastException: java.lang.String несовместимо с [Ljava.lang.Object;

Код компилируется нормально.

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

Ответы [ 4 ]

2 голосов
/ 17 ноября 2011

Я не уверен, почему вы думаете, что запрос вернет список Object массивов.

Запрос, скорее всего, вернет список из String с (если только объект «Валюта» не содержит объект «Валюта», в этом случае я бы пересмотрел проект данных), поэтому он работает в предположении, что это скалярный запрос, Ваш код может быть упрощен до:

String currencySql = "select C.Currency from Currency C";
Query currencyQuery = this.em.createQuery(currencySql);

List<String> currencyList = (List<String>) currencyQuery.getResultList();
0 голосов
/ 17 ноября 2011

Проблема в том, что currencyList должен иметь тип List, а не List<Object[]>. Это также означает, что переменная currency в вашем цикле должна иметь тип Object, так что она фактически совместима с String (отсюда и исключение). Затем вам нужно будет убедиться, что в нем есть строка.

В качестве альтернативы у вас есть достаточно информации в SQL, чтобы знать, что результатом будет действительно List<String>, что, в свою очередь, позволит вам объявить currency типа String. Но это будет связано с формально небезопасным составом актеров; это будет место, где вы знаете, что это правильно, а компилятор - нет, поэтому вы получите предупреждение. Это было бы подходящим местом для подавления предупреждения (только на этом одном назначении / приведении; вы хотите попытаться избежать подавления предупреждений, потому что это может скрыть серьезные проблемы).

0 голосов
/ 17 ноября 2011

Я думаю, что что-то не так в том, что вы получаете список валют из запроса. Вам не нужно создавать другой массив. Попробуйте это

List<String> currencyList = new ArrayList<String>();

//code to fetch currency
String currencySql = "select C.Currency from Currency C";
Query currencyQuery = this.em.createQuery(currencySql);

currencies = currencyQuery.getResultList();

for (String currency : currencies) {    
    currencyList.add(currency);
}
0 голосов
/ 17 ноября 2011

Проверьте в отладчике, что находится в переменной валюты после

currencyQuery.getResultList();

Возможно, это не список Object [], а список строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...