8

当我在这个线程中运行一些代码来测试一些代码时,我发现了一件奇怪的事情,如果你考虑下面的程序

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

4

1 回答 1

4

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

Eclipse 3.7 的 javac5、javac6 和 ecj 中似乎存在此错误,但在 Eclipse 3.8 及更高版本中已修复。

于 2013-05-04T20:55:00.270 回答