Groovy编译器调用错误的重载java方法

时间:2012-03-20 23:54:20

标签: java grails groovy

我在发布此问题之前搜索了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中有很多遗留代码)。

关于如何解决此问题的任何想法?
谢谢你的时间!

编辑:我试过了     abc.doSomething(path,list as ArrayList) 我也得到了相同的结果..

3 个答案:

答案 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方法。