考虑以下示例代码:

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。因此,由于可以使用long或Long版本,因此仍然感到困惑。这个比那个好吗?也许,但这是一条很好的路线。

09-27 00:02