【问题标题】:Passing String argument to Object method parameter in Groovy在 Groovy 中将 String 参数传递给 Object 方法参数
【发布时间】:2026-02-03 09:20:02
【问题描述】:

最近,有人要求我解决 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 中,不可能有两个相同的方法签名。为什么报错信息中会出现多个方法签名?

【问题讨论】:

    标签: groovy parameters jvm arguments superclass


    【解决方案1】:

    以下代码有效:

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

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

    【讨论】: