Java 重载 : reference to call ambiguous

标签 java overloading primitive jls

考虑以下示例代码:

public class TestClass {

    public void doSth(String str, String l, Object... objects) {
        System.out.println("A");
    }

    public void doSth(String str, Object... objects) {
        System.out.println("B");
    }

}

当我现在调用 new TestClass().doSth("foo", "bar") 时,我得到了预期的结果 A。但是,如果我通过将参数 l 更改为基本类型来更改第一个方法的方法签名:

public class TestClass {

    public void doSth(String str, long l, Object... objects) {
        System.out.println("A");
    }

    public void doSth(String str, Object... objects) {
        System.out.println("B");
    }

}

调用 new TestClass().doSth("foo", 2L) 将产生一个 reference to call ambiguous 编译时错误。

我考虑了一段时间,也咨询了this stackoverflow question ,但我无法理解为什么会这样。在我看来,doSth("foo", 2L) 更特定于 doSth(String string, long l, Object... obj) 签名,应该允许编译器也会得出这个结论。

最佳答案

在这种情况下,自动装箱会让您感到悲伤。具有讽刺意味的是,在那之前你是对的 - “长”版本很容易被选中。

基本上,编译器知道它可以从您的值创建一个 Long,当然,它是一个对象。所以它仍然很困惑,因为可以使用长版本或长版本。这个比那个好吗?也许吧,但这是一条很好的线。

关于Java 重载 : reference to call ambiguous,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37333102/

相关文章:

java - java 项目的动态数据存储以及搜索和映射

java - 如何使用Android Java在zebra ez320上打印条码?

wcf - 具有不同签名的相同方法的推荐命名约定?

java - Java 中的类型删除和重载 : Why does this work?

java - Core Java 这个简单语法有什么问题

java - 可能的编码错误[I@24e11c

java - 动态添加的 View 不会重置?

generics - 具有泛型参数类型的函数

opengl - 如何让多边形抗锯齿工作?

java - Java 中的 int 与 float 算术效率