没有方法签名:java.lang.Boolean.getAt()适用于参数类型:(java.lang.Integer)

时间:2015-09-23 13:35:40

标签: groovy closures

当我按下面的错误读取时,我正在写一个groovy代码:

Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: java.lang.Boolean.getAt() is applicable for argument types: (java.lang.Integer) values: [0]
Possible solutions: getAt(java.lang.String), putAt(java.lang.String, java.lang.Object), wait(), grep(), getClass(), wait(long)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)
    at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at myPackage.myClass.myMethod_closure3_closure5.doCall(line:xyz)
    :
    :

所以你可以在最后一行看到,我的方法有两个嵌套的闭包。行号xyz正在执行以下操作:

(rvar1,rvar2) = methodThatReturnsMultipleValues(param1,param2)

我调试了代码,发现methodThatReturnsMultipleValues()返回[false,false],如下所示:

methodThatReturnsMultipleValues(def param1,def param2)
{
    //...
    return [false,false]
}   

然而,当我在调试行号时走出方法时,xyz给出了上述异常。根据groovy,这应该将rvar1rvar2分配给false。我试图在像这样的较小代码上复制异常:

class TempClass
{
    static main(def args)
    {
         boolean bvar1 = false
         boolean bvar2 = false
         (bvar1, bvar2) = returnMultipleValues()
         println bvar1
         println bvar2
    }

    static private returnMultipleValues()
    {
        boolean a = false
        boolean b = false
        return [a, b]
    }
}

然而,不幸的是,上面的代码工作正常并正确地打印false两次。所以无法在小代码上复制问题。令人惊讶的是,当我将xyz行改为:

def a = methodThatReturnsMultipleValues(param1,param2)

a会被true分配,并以所需的方式继续,因为我正在测试不会使用rvar1rvar2的情况。只有当我将xyz行改回

时才会这样
(rvar1,rvar2) = methodThatReturnsMultipleValues(param1,param2)

错误会再次出现,但在使用rvar1rvar2的情况下会失败。

我只是迷失方向,我应该在哪里寻找。尤其是java.lang.Boolean.getAt()并没有让我有多大意义。

PS:我知道只解释代码的行为,因为我观察可能不会完全有助于解决我的查询,我应该提供完整的代码,以便其他人也可以观察更多的东西,但老实说我的代码并不容易单独使用,我的意思是直接从main()调用。所以让我知道我是否应该付出额外的努力才能真正让它从main()调用,并尽可能在尽可能小的代码上复制问题。但在此之前,我真的很感激任何盲目的猜测来解决这个问题。

0 个答案:

没有答案