将String参数传递给Groovy中的Object方法参数

时间:2018-04-27 04:15:36

标签: groovy parameters jvm arguments superclass

最近,我被要求在Groovy中解决一个奇怪的错误。代码如下所示:

int OQ = line.getAttribute("OrderedQuantity");
line.setAttribute("OrderedQuantity", OQ.toString(OQ+50));

,错误消息如下所示:

No signature of method: 
oracle.apps.scm.doo.common.extensions.Line.setAttribute() is applicable for argument types: (java.lang.String, java.lang.String) values: [OrderedQuantity, 59]
Possible solutions: setAttribute(java.lang.String, java.lang.Object), setAttribute(java.lang.String, java.lang.Object), getAttribute(java.lang.String), getAttribute(java.lang.String), getAttribute(java.lang.String). (DOO-2685874)

来自Java背景,我发现这令人困惑。在Java中,我们将完成:

line.setAttribute("OrderedQuantity", Integer.toString(OQ+50));

但是,我在Groovy控制台中测试了以下代码,它似乎有效:

int x = 5;
print x.toString(x+2);​

输出

7

这是正确的。

"可能的解决方案"在错误消息中,建议setAttribute方法接受String作为第一个参数,Object接受第二个参数。显然,原始代码是正确的(至少在Java中),因为String也是一个Object,因此setAttribute(java.lang.String,java.lang.Object)方法签名应该是有效的。

错误的原因是什么?可以将子类参数传递给Groovy中的超类方法参数吗?

另外,我注意到相同的方法签名被重复多次。在Java中,不可能有两个相同的方法签名。为什么错误消息中会出现多个方法签名?

1 个答案:

答案 0 :(得分:0)

以下代码有效:

def OQ = line.getAttribute("OrderedQuantity") + 50;
line.setAttribute("OrderedQuantity", OQ);

问题已经解决,但我会接受任何人解释其工作原理的答案。