最近,我被要求在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中,不可能有两个相同的方法签名。为什么错误消息中会出现多个方法签名?
答案 0 :(得分:0)
以下代码有效:
def OQ = line.getAttribute("OrderedQuantity") + 50;
line.setAttribute("OrderedQuantity", OQ);
问题已经解决,但我会接受任何人解释其工作原理的答案。