Java重载:引用调用模糊

Ent*_*usc 11 java primitive overloading 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");
    }

}
Run Code Online (Sandbox Code Playgroud)

当我现在打电话时,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");
    }

}
Run Code Online (Sandbox Code Playgroud)

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

我现在考虑了那个问题,并且还咨询了这个stackoverflow问题,但我无法理解为什么会发生这种情况.在我看来,签名doSth("foo", 2L)更具体doSth(String string, long l, Object... obj),应该让编译器也得出这个结论.

std*_*bar 5

在这种情况下,自动拳击会让你感到悲伤.具有讽刺意味的是,在此之前你是正确的 - "长"版本很容易被选中.

基本上编译器知道它可以从你的值创建一个Long,当然,它是一个Object.所以它仍然很混乱,因为可以使用long版本或Long版本.这个比那个好吗?也许,但这是一个非常好的路线.

  • @Tunaki阶段1和2也排除了变量arity方法,因此在第3阶段之前都不考虑OP的方法.奇怪的是,`doSth("foo",2L,null)`将编译,因为第1个子弹下的斜体字符(in你的链接)状态. (3认同)