【问题标题】:groovy ArrayList casting (note: appears to be a bug with the runtime error line identification, not ArrayList casting)groovy ArrayList 强制转换(注意:似乎是运行时错误行标识的错误,而不是 ArrayList 强制转换)
【发布时间】:2011-10-28 13:11:14
【问题描述】:

读者注意:感谢 Tim 在下面的帮助,我能够解决问题。问题的根源不是 ArrayList 转换,而是运行时引擎将错误指向错误行的事实,即我在下面显示的访问列表的行。真正的错误是低于 4 行,我在将元素分配到刚刚检索到的元素中时犯了一个错误。

我有一个小的 Result 类(在我的 grails 控制器类的底部),然后在我的代码中,我这样做了

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

帮助编译器知道 bestResults 是什么(但尝试了下面的其他形式)。然后,我尝试通过以下方式访问这个数组列表:

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

并且,我收到“无法将对象...转换为 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

其中results定义为顶部的浮点数组,即:

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

【问题讨论】:

    标签: grails groovy


    【解决方案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(即:float[])转换为 Result 对象

    您发布的代码中一定缺少某些东西,好像我将它粘贴到一个 groovy 控制台中一样,它工作正常

    这有点奇怪……

    您确实意识到您将相同的 Result 实例添加到列表中 10 次,不是吗?不是 10 个单独的实例?

    【讨论】:

    • Tim,我的意思是(在 grails 中)我有一个 BlahController 类,然后在底部创建一个小 Result 类。
    • @RayK 您可以编辑您的问题以发布您正在尝试做的事情的缩减(但更完整)示例,以及它给出的错误吗?如您所见,代码有效,因此您正在做的其他事情一定有问题
    • @RayK 更新了答案...认为您仍然缺少一些东西...那是失败的实际代码吗?因为我看不出它是如何失败的......
    • 是的,蒂姆,是的。但我认为你在打什么。我分配给 Result 类的结果是:def results = new float[2 * deltaRange + 1] as float[].
    • ...我对虚假结果的同一个实例没意见...我只想在生成真实结果时进行比较,将最好的结果保留在那里;它们的系数都小于 1.0。 @TIM - 请注意,我什至没有分配那个浮点结果数组,直到我得到上面的错误,检索对象。另外,我尝试了您发布的代码,并且可以正常工作。所以它以某种方式与浮点数组有关(据说还没有出现在图片中......嗯)。
    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2012-08-07
    • 2011-04-24
    • 1970-01-01
    • 2014-04-18
    • 2011-02-21
    相关资源
    最近更新 更多