【问题标题】:Java method overload - ambiguityJava 方法重载 - 歧义
【发布时间】:2013-05-04 19:59:08
【问题描述】:

当我在这个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));
    }
}

我原以为 Java 编译器会由于字节码擦除属性而显示 歧义错误,但事实并非如此。现在,当我尝试运行此代码时,我期待 test1(List) 将被调用,输出将是 "abc",但令我惊讶的是它调用 test1(List&lt;Integer&gt;)(输出是 1

我什至像下面这样尝试过

List l = new ArrayList();
l.add("a");
System.out.println(new OverloadTest().test1(l));

但仍然发现 Java 调用 test1(List&lt;Integer&gt; param) 方法,当我检查 param 时,它有 String "a"(Java 是如何将 List&lt;String&gt; 转换为 List&lt;Integer&gt; 的?)

【问题讨论】:

  • 您提供的代码对我来说根本无法编译 - 我收到错误消息:error: name clash: test1(List&lt;Integer&gt;) and test1(List) have the same erasure
  • 这里也一样,在 java 中模板化的数据结构是相关的,所以它不应该编译,但是如果你使用 c++ 类似的东西可能会编译为模板类不共享任何东西
  • 我在 Eclipse Indigo, Java 1.6.0_30 中编译了代码
  • @sanbhat 你试过用javac 编译吗?可能 Eclipse 的编译器有问题。
  • javac 给了我模棱两可的错误!! Eclipse Indigo 如何编译甚至运行这段代码??

标签: java overloading javac


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多