我在发布此问题之前搜索了StackOverflow但我无法找到正确的答案。对不起,如果这是转贴。我的问题是:
我有一个在我的java类中重载的方法:
class ABC{
public boolean doSomething(String path, ArrayList<SomeObject> objList){
// calling the method below in a loop
}
public boolean doSomething(String path, SomeObject obj){
// Some code here
}
}
我正在从我的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)
}
问题是groovy编译器正在调用abc.doSomething(String str,SomeObject obj)方法而不是abc.doSomething(String str,ArrayList objList)方法。
我正在使用带有grails插件(STS)的eclipse IDE,这是一个更大的grails项目的一部分(我们公司在java中有很多遗留代码)。
关于如何解决此问题的任何想法?
谢谢你的时间!
答案 0 :(得分:2)
您可以使用您提到的类的简单示例重现这一点吗?我试过了,但我得到了预期的行为。
<强> 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使用方法的运行时类型信息来决定调用哪个重载版本(可以找到这个例子here)。我不建议更改doSomthing
as suggested的签名,因为它会不必要地污染类的接口;问题可能在其他地方。
答案 1 :(得分:1)
最简单的答案是确保您的重载完全不明确。
让两个调用具有截然不同的API,看看问题是否消失,或者新的错误消息是否指向了一个常见的问题。
public class ABC {
public boolean doSomething(String path, int ignored, ArrayList<Object> objList){
// calling the method below in a loop
}
public boolean doSomething(String path, Object obj){
// Some code here
}
}
答案 2 :(得分:1)
好的,我找到了答案。这是一个日食IDE问题,我必须运行“grails clean”命令并重建该项目。现在groovy代码正在调用正确的java方法。