san*_*hat 8 java overloading javac
虽然我正在做一些运行来测试这个线程中的一些代码,但我发现了一个奇怪的事情,如果你考虑以下程序
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));
}
}
Run Code Online (Sandbox Code Playgroud)
我期待Java编译器由于字节码Erasure属性而显示模糊错误,但事实并非如此.现在,当我尝试运行此代码时,我期待test1(List)将被调用并且输出将是"abc"令我惊讶的它被调用test1(List<Integer>)(输出是1)
我甚至尝试过如下
List l = new ArrayList();
l.add("a");
System.out.println(new OverloadTest().test1(l));
Run Code Online (Sandbox Code Playgroud)
但仍然发现Java调用test1(List<Integer> param)方法,当我检查param它时,它有String"a"(Java如何投射List<String>到List<Integer>?)
这是一个已修复的错误。https://bugs.eclipse.org/bugs/show_bug.cgi?id=354229
看起来这个 bug 存在于 Eclipse 3.7 的 javac5、javac6 和 ecj 中,但在 Eclipse 3.8 及更高版本中已修复。