例如,一个类包含两个方法,
public void find(Object id);
public void find(Object... ids);
当我调用find(null)时,为什么jvm实际上执行了最后一个?
在Calling Java varargs method with single null argument?的公认答案中,我们可以读到
Java不知道它应该是哪种类型。它可以是一个空对象,也可以是一个空对象数组。 对于单个参数,假定为后者。”
但是那仍然没有解释。谁能提供更多信息,例如语言规范?
答案 0 :(得分:2)
Object[]
比Object
更具体。
如果可以使用多个成员方法并且适用于 方法调用,有必要选择一种方法来提供 运行时方法分派的描述符。 Java编程 语言使用选择最具体方法的规则。
非正式的直觉是,一种方法比 如果可以传递第一种方法处理的任何调用,则返回另一个 没有编译时错误。
同一章还提供了一个有关问题情况的示例。
[...]可变Arity方法在 第一阶段。例如,在一个类中声明m(Object ...) 已经声明m(Object)导致不再选择m(Object) 一些调用表达式(例如m(null)),因为m(Object [])更 具体的。