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),应该让编译器也得出这个结论.
在这种情况下,自动拳击会让你感到悲伤.具有讽刺意味的是,在此之前你是正确的 - "长"版本很容易被选中.
基本上编译器知道它可以从你的值创建一个Long,当然,它是一个Object.所以它仍然很混乱,因为可以使用long版本或Long版本.这个比那个好吗?也许,但这是一个非常好的路线.
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |