Недавно меня попросили решить странную ошибку в 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 также является объектом, поэтому подпись метода setAttribute (java.lang.String, java.lang.Object) должна быть действительной.
В чем может быть причина ошибки? Можно ли передавать аргументы подкласса в параметры метода суперкласса в Groovy?
Кроме того, я заметил, что сигнатуры одного и того же метода повторяются несколько раз. В Java невозможно иметь две одинаковые сигнатуры метода. Почему подписи нескольких методов появляются в сообщении об ошибке?