在 Groovy 中将字符串参数传递给对象方法参数

Passing String argument to Object method parameter in Groovy

最近,我被要求解决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

这是正确的。

错误消息中的 "possible solutions" 表明 setAttribute 方法接受 String 作为第一个参数,接受 Object 作为第二个参数。显然,原始代码是正确的(至少在 Java 中),因为 String 也是一个对象,所以 setAttribute(java.lang.String, java.lang.Object) 方法签名应该是有效的。

错误的原因可能是什么? Groovy?

中可以将子类参数传递给超类方法参数吗

顺便说一句,我注意到相同的方法签名会重复多次。在 Java 中不可能有两个相同的方法签名。为什么报错信息中会出现多个方法签名?

以下代码有效:

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

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