虽然我正在做一些运行来测试这个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));
}
}
由于字节码Erasure属性,我期待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>
}?)
答案 0 :(得分:4)
这是一个固定的错误。 https://bugs.eclipse.org/bugs/show_bug.cgi?id=354229
看起来这个bug存在于Eclipse 3.7的javac5,javac6和ecj中,但它已在Eclipse 3.8及更高版本中修复。