кастинг groovy ArrayList (примечание: похоже, ошибка с идентификацией строки ошибки во время выполнения, а не с кастингом ArrayList)

#grails #groovy

#grails #groovy

Вопрос:

ПРИМЕЧАНИЕ ДЛЯ ЧИТАТЕЛЯ: благодаря помощи Тима, приведенной ниже, я смог решить проблему. Корнем проблемы было не приведение ArrayList, а тот факт, что механизм выполнения указал ошибку на неправильную строку, то есть ту, которую я показываю ниже, где я обращаюсь к списку. Реальная ошибка была на 4 строки ниже, где я допустил ошибку, присвоив элемент элементу, который я только что извлек.

У меня есть небольшой класс результатов (внизу моего класса контроллера grails), а затем в моем коде я делаю

 ArrayList<Result> bestResults = new ArrayList<Result>()
 

чтобы помочь компилятору узнать, что такое bestResults (но попробовал другие формы ниже). Затем я пытаюсь получить доступ к этому списку массивов через:

 for (int r = 0; r < topSet; r  ) {
   Result res = bestResults[r] as Result
 

и я получаю сообщение «Невозможно привести объект… к бла-бла.Результат «ошибка во время выполнения.

Я пробовал другие варианты того и другого, а именно:

 ArrayList bestResults = new ArrayList() 
 

с

 Result res = (Result) bestResults[r]
 

или просто

 Result res = bestResults.get(r) as Result
 

и я всегда получаю одну и ту же ошибку кастинга. Кажется, я просто не могу угодить Заводному «движку» / JVM! 🙂 🙁

Не могли бы вы помочь?

———————— Более полный код ——————

Результирующий класс находится в нижней части моего класса grails controller (main), а именно:

 class Result {
   float factor
   def results = null // NOTE: this will hold an array of float
}
 

Затем в контроллере я делаю следующее, вводя bestResults в фиктивные значения:

  def results = new float[2 * deltaRange   1] as float[] // the results array gets assigned to bestResults AFTER the error I get, so it seems non-relevant

 ArrayList<Result> bestResults = new ArrayList<Result>()
 Result fakeResult = new Result(factor: 100.0f, results: null)
 for (int r = 0; r < 10; r  ) {
        bestResults.add(r,fakeResult)
 }
 

Затем, когда я иду, чтобы вставить реальный результат, я сталкиваюсь с проблемой, выполняя:

 for (int r = 0; r < 10; r  ) {
  Result res = bestResults.get(r) as Result
 

или выполнение

   Result res = bestResults[r] as Result
 

или

    Result res = bestResults[r]
 

Все выдают ошибку:

 Message: Cannot cast object '[F@4f5b6d' with class '[F' to class 'alwaysbetter.Result'
 

* После этой ошибки у меня есть код, который выполняет:

 bestResults[r].results =  results
 

где результаты определяются как массив значений с плавающей точкой вверху, а именно:

 def results = new float[2 * deltaRange   1] as float[] 
 

Ответ №1:

Верно, проблема в последнем бит информации, который вы предоставили…

 def results = new float[2 * deltaRange   1] as float[] 
 

в groovy нет смысла, чтобы получить массив 2 * deltaRange 1 элементов с плавающей запятой, ваш лучший выбор, вероятно:

 float[] results = [ 0 ] * ( 2 * deltaRange   1 )
 

Оригинальный ответ

Это внутри кода Java?

Когда вы говорите «основной класс», что вы имеете в виду?

Как это связано с grails?

Это работает в groovy:

 class Result {
  String name
}

ArrayList<Result> bestResults = new ArrayList<Result>()

bestResults << new Result( name:'tim' )

for (int r = 0; r < bestResults.size(); r  ) {
   Result res = bestResults[r]
   println res
}
 

Или, что еще лучше:

 bestResults.each { Result r -> println r }
 

Редактировать после обновления вопроса

В этом сообщении об ошибке говорится, что вы пытаетесь преобразовать array of float (ie: float[] ) в результирующий объект

Должно быть, в коде, который вы опубликовали, чего-то не хватает, так как если я вставлю его в заводную консоль, он будет работать нормально

Хотя это немного странно…

Вы ведь понимаете, что добавляете один и тот же Result экземпляр в Список 10 раз, не так ли? Не 10 отдельных экземпляров?

Комментарии:

1. Тим, я имею в виду (в grails) У меня есть класс BlahController, а затем внизу я создаю небольшой класс результатов.

2. @RayK можете ли вы отредактировать свой вопрос, чтобы опубликовать сокращенный (но более полный) пример того, что вы пытаетесь сделать, и ошибку, которую он выдает? Как вы можете видеть, код работает, так что это, должно быть, проблема с чем-то еще, что вы делаете

3. @RayK обновил ответ… думаю, ты все еще чего-то не понимаешь… это тот самый код, который терпит неудачу? Потому что я не понимаю, как это может потерпеть неудачу…

4. Да, Тим, так оно и есть. Но мне кажется, ты к чему-то клонишь. Результаты, которые я присваиваю классу Result: def results = new float[2 * deltaRange 1] как float[] .

5. … Я согласен с тем же экземпляром фиктивного результата… Я просто хочу, чтобы было с чем сравнивать, когда я генерирую реальные результаты, добавляя туда наилучшие результаты; все они будут иметь коэффициент меньше 1,0. @TIM — примечание, я даже не назначаю этот массив результатов с плавающей запятой, пока не получу ошибку выше, извлекая объект. Кроме того, я попробовал опубликованный вами код, и он работает. Так что это как-то связано с массивом с плавающей запятой (которого, предположительно, еще нет на картинке … хм).