考虑以下示例代码:
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版本,因此仍然感到困惑。这个比那个好吗?也许,但这是一条很好的路线。