java - 将 null 作为参数传递给重载的可变参数方法(Object...o)和非可变参数方法(Object o)时,为什么要执行可变参数方法?
问题描述
例如,一个类包含两个方法,
public void find(Object id);
public void find(Object... ids);
当我调用 find(null) 时,为什么 jvm 实际执行最后一个?
在使用单个空参数调用 Java varargs 方法的公认答案中?我们可以读到
Java 不知道它应该是什么类型。它可以是一个空对象,也可以是一个空对象数组。对于单个参数,它假定后者。”
但这仍然无法解释。任何人都可以提供更多信息,例如语言规范吗?
解决方案
Object[]
是比 更具体的类型Object
。
如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。Java 编程语言使用选择最具体方法的规则。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时错误,那么一个方法比另一个方法更具体。
同一章也有一个关于所讨论情况的例子。
[...] 可变参数方法在第一阶段被视为固定参数方法。例如,在已经声明 m(Object) 的类中声明 m(Object...) 会导致不再为某些调用表达式(例如 m(null))选择 m(Object),如 m(Object[] ) 更具体。
推荐阅读
- python - 一组列表变成整数输出
- javascript - 如何将editorjs json输出保存在数据库中并在我的节点应用程序的服务器端处理它?
- django - 在前端 PUT 请求返回内部服务器 500 错误 | Django Vue
- android - android ndk字符串拼接调用malloc函数。当我将结果返回到 JAVA 层时,我需要释放它吗?
- sqlalchemy - 在sqlalchemy中的某个组中的另一行上查询具有条件的行
- reactjs - React 中的 Webpack 无法加载带有 GLTF 扩展的 3D 模型,显示 404 not found
- docker - 如何使服务仅在特定的 docker 网络上侦听?
- php - 致命错误:未捕获的错误:在 bool 上调用成员函数 fetchAll()
- python - 如何为复杂代码分配新变量?
- html - 在表格内旋转 svg 图像,但 td 不遵循高度和宽度