考虑以下示例代码:
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/