#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 — примечание, я даже не назначаю этот массив результатов с плавающей запятой, пока не получу ошибку выше, извлекая объект. Кроме того, я попробовал опубликованный вами код, и он работает. Так что это как-то связано с массивом с плавающей запятой (которого, предположительно, еще нет на картинке … хм).