首页 > 解决方案 > 将 null 作为参数传递给重载的可变参数方法(Object...o)和非可变参数方法(Object o)时,为什么要执行可变参数方法?

问题描述

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

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

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

在使用单个空参数调用 Java varargs 方法的公认答案中?我们可以读到

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

但这仍然无法解释。任何人都可以提供更多信息,例如语言规范吗?

标签: javajvm

解决方案


Object[]是比 更具体的类型Object

根据JLS §15.12.2

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

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时错误,那么一个方法比另一个方法更具体。

同一章也有一个关于所讨论情况的例子。

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


推荐阅读