groovy ArrayList casting (примечание: похоже, что это ошибка с идентификацией строки ошибки времени выполнения, а не ArrayList) - PullRequest
1 голос
/ 28 октября 2011

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

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

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

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

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

и я получаю сообщение об ошибке «Cannot cast object ... to blahblah.Result».

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

ArrayList bestResults = new ArrayList() 

с

Result res = (Result) bestResults[r]

или просто

Result res = bestResults.get(r) as Result

и я всегда получаю одну и ту же ошибку. Я просто не могу угодить Groovy "движок" / JVM! :-): - (

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

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

Класс Result находится в нижней части моего (основного) класса контроллера Grails, а именно:

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 Ответ

1 голос
/ 28 октября 2011

Правильно, проблема в последней части информации, которую вы дали ...

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

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

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

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

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

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

Как это относится к Граалю?

Это работает в 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 (то есть: float[]) в объект Result

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

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

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

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