Можете ли вы воспроизвести это на простом примере, используя упомянутые вами классы? Я пытался, но получил ожидаемое поведение.
SomeObject.java:
public class SomeObject {
public String what;
public SomeObject(String what) {
this.what = what;
}
}
ABC.java:
import java.util.List;
public class ABC {
public void doSomething(String path, List<SomeObject> objects) {
System.out.println("Doing something with many objects");
for (SomeObject obj : objects) {
doSomething(path, obj);
}
}
public void doSomething(String path, SomeObject obj) {
System.out.println("Doing something with: " + obj.what);
}
}
test.groovy:
void performDoSomething(ABC abc, String path, String[] strList){
def list = []
for (str in strList) {
SomeObject sObj = new SomeObject(str) // EDIT: sorry I missed this line before
list.add(sObj)
}
if (abc) abc.doSomething(path, list)
}
performDoSomething(new ABC(), 'some path', ['hello', 'world'] as String[])
Я запускаю это (в том же каталоге, что и файлы):
javac *.java
groovy test.groovy
И вывод, который я получаю:
Doing something with many objects
Doing something with: hello
Doing something with: world
Это означает, что Groovy вызывает правильный перегруженный метод, doSomething(String, List<SomeObject>)
. Это то, что ожидается, поскольку Groovy использует информацию о типе среды выполнения для методов, чтобы решить, какую перегруженную версию вызывать (пример этого можно найти здесь ). Я бы не рекомендовал изменить сигнатуру doSomthing
, как предложено , так как это излишне загрязнит интерфейс класса; проблема, вероятно, где-то еще.