gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:06:41 62 4
gpt4 key购买 nike

在发布这个问题之前我搜索了 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
}
}

我从我的常规代码中调用上面的类,如下所示:

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(路径,列表为ArrayList)也是,但我得到了相同的结果..

最佳答案

您可以使用您提到的类通过一个简单的示例来重现这一点吗?我尝试过,但得到了预期的行为。

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);
}
}

测试.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

这意味着正确的重载方法,doSomething(String, List<SomeObject>) ,由 Groovy 调用。这是预期的,因为 Groovy 使用方法上的运行时类型信息来决定调用哪个重载版本(可以在 here 找到这样的示例)。我建议更改 doSomthing 的签名as suggested ,因为它会不必要地污染类的接口(interface);问题可能出在其他地方。

关于java - Groovy 编译器调用错误的重载 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9796758/

62 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com