Java方法重载 - 歧义

时间:2013-05-04 19:59:09

标签: java overloading javac

虽然我正在做一些运行来测试这个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> }?)

1 个答案:

答案 0 :(得分:4)

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

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