Java方法重载 - 歧义

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>?)

dur*_*597 4

这是一个已修复的错误。https://bugs.eclipse.org/bugs/show_bug.cgi?id=354229

看起来这个 bug 存在于 Eclipse 3.7 的 javac5、javac6 和 ecj 中,但在 Eclipse 3.8 及更高版本中已修复。