虽然我正在运行以测试此 thread 中的一些代码我发现了一件奇怪的事情,如果你考虑下面的程序
import java.util.ArrayList;
import java.util.List;
public class OverloadTest {
public String test1(List l){
return "abc";
}
public int test1(List<Integer> l){
return 1;
}
public static void main(String [] args) {
List l = new ArrayList();
System.out.println(new OverloadTest().test1(l));
}
}
由于字节码删除属性,我原以为 Java 编译器会显示歧义错误,但事实并非如此。现在,当我尝试运行这段代码时,我期待的是 test1(List)
将被调用,输出将是 "abc"
但令我惊讶的是它叫test1(List<Integer>)
(输出为 1
)
我什至试过如下
List l = new ArrayList();
l.add("a");
System.out.println(new OverloadTest().test1(l));
但还是发现Java调用了test1(List<Integer> param)
方法和当我检查 param
它有 String
“a”(Java 是如何将 List<String>
转换为 List<Integer>
的?)
最佳答案
这是一个已修复的错误。 https://bugs.eclipse.org/bugs/show_bug.cgi?id=354229
看起来这个错误存在于 Eclipse 3.7 的 javac5、javac6 和 ecj 中,但它在 Eclipse 3.8 及更高版本中已修复。
关于Java方法重载——歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16378393/