当前位置: 首页 > 面试题库 >

重载与加宽和装箱

白飞飙
2023-03-14
问题内容
public void add(long... x){}
public void add(Integer... x){}

add(2);

这会产生错误…为什么加宽和装箱均不执行叠加?

但是没有vararg的重载可以正常工作

public void add(long x){}
    public void add(Integer x){}

    add(2);

在这里将执行add(long x),这将扩大拳击效果……为什么与var参数的概念不同


问题答案:

Java编译器执行三种尝试来选择适当的方法重载(JLS§15.12.2.1):

  • 阶段1:通过子类型识别匹配Arity方法
    (可能的装箱转换和带有varargs的方法将被忽略)

  • 阶段2:确定适用于方法调用转换的匹配Arity方法
    (考虑了装箱转换,但忽略具有varargs的方法)

  • 阶段3:确定适用的可变Arity方法
    (检查所有可能性)

因此,通过您的示例,它的工作方式如下:

  • 没有可变参数:add(long x)被(此方法适用由子类型,因为识别为在第一阶段只适用方法int是的一个亚型long,§JLS4.10.1),从而使下面的相位不执行。

  • 使用varargs:重载解析算法进入第3阶段,这两种方法都被确定为适用,并且编译器无法选择它们中最具体的方法(选择最具体的方法是另一种复杂的算法),因此报告了歧义。

也可以看看:

  • Java语言规范,第七版


 类似资料:
  • 问题内容: 两者之间有什么区别。我知道Boxing正在将原始值转换为引用。什么在扩大。还有,应该先进行顺序装箱还是应进行加宽的顺序? 问题答案: 扩展是将变量转换为具有更大类型的变量。 可以使用原始或引用类型进行扩展。 例如 : -> -> 正如JLS所述: 装箱转换(第5.1.7节) [是](可选)后跟加宽的参考转换 资源: JLS-扩展原始转换 JLS-扩大参考转换

  • 了解如何创建和管理插件。 创建插件 选择“插件”>“开发”>“创建插件”,该菜单将引导您进入 Adobe I/O 开发者控制台。 有关更多创建、测试、提交插件的入门信息,请参阅 Adobe XD 开发者文档。创建插件 查看和安装插件 要查看可安装的插件,请选择“插件”>“发现插件”,或者单击工具栏上的“插件”图标。此外,单击“发现插件 (+)”图标启动“插件管理器”。 查看和安装插件 在插件管理器

  • 你可以使用我们提供的 Pip, Docker, Virtualenv, Anaconda 或 源码编译的方法安装 TensorFlow. Pip 安装 Pip 是一个 Python 的软件包安装与管理工具. 在安装 TensorFlow 过程中要涉及安装或升级的包详见 列表 首先安装 pip (或 Python3 的 pip3 ): # Ubuntu/Linux 64-bit $ sudo apt

  • 安装与卸载 Compose 支持 Linux、macOS、Windows 10 三大平台。 Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。 Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。 $

  • 下载软件 当前版本:SkyCaiji V2.3.3   码云Github站长下载A5下载<a href="javascript:;" onclick="modal('宝塔面板','登录宝塔面板后台»软件商店»一键部署»蓝天采集器 注意:一键部署只能安装在根目录,如需安装在子目录请手动下载软件');">宝塔面板 升级软件 可直接在后台首页中检测更新后点击升级,或者将压缩包上传至服务器解压覆盖即可!

  • 简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当; Hutool是项目中“util”包友好的替代,它节省了开发人员对项目