将null作为参数传递给重载的varargs方法(对象... o)和非varargs方法(对象o)时,为什么执行varargs方法?

时间:2019-01-12 12:53:09

标签: java jvm

例如,一个类包含两个方法,

public void find(Object id);
public void find(Object... ids);

当我调用find(null)时,为什么jvm实际上执行了最后一个?

Calling Java varargs method with single null argument?的公认答案中,我们可以读到

  

Java不知道它应该是哪种类型。它可以是一个空对象,也可以是一个空对象数组。 对于单个参数,假定为后者。”

但是那仍然没有解释。谁能提供更多信息,例如语言规范?

1 个答案:

答案 0 :(得分:2)

Object[]Object更具体。

根据JLS §15.12.2

  

如果可以使用多个成员方法并且适用于   方法调用,有必要选择一种方法来提供   运行时方法分派的描述符。 Java编程   语言使用选择最具体方法的规则。

     

非正式的直觉是,一种方法比   如果可以传递第一种方法处理的任何调用,则返回另一个   没有编译时错误。

同一章还提供了一个有关问题情况的示例。

  

[...]可变Arity方法在   第一阶段。例如,在一个类中声明m(Object ...)   已经声明m(Object)导致不再选择m(Object)   一些调用表达式(例如m(null)),因为m(Object [])更   具体的。