当我在这个线程中运行一些代码来测试一些代码时,我发现了一件奇怪的事情,如果你考虑下面的程序
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>
?)