java - 具有可变参数参数的多个构造函数
问题描述
给定这两个构造函数:
SomeClass(int... params)
{
// Do things
}
SomeClass(long... otherParams)
{
// Do other things
}
当对象 foo 被实例化时会发生什么?
SomeClass foo = new SomeClass();
是否以某种方式调用了未定义的默认构造函数?还是调用了具有空数组的那些构造函数之一?如果有,有什么先例?
我做了一些基本的测试,发现如果定义了一个没有参数的构造函数,那么它将被调用。否则,似乎调用了一个模棱两可的。
解决方案
根据下面“Java 中方法重载中的可变参数”问题中的这个非常好的答案,Java 编译器用于选择要调用的方法签名的规则。它们基于JLS 5.3。方法调用转换文档。
- 原始扩展使用可能的最小方法参数
- Wrapper 类型不能扩展到另一个 Wrapper 类型
- 您可以从 int Box 到 Integer 并扩大到
Object
但不扩大到Long
- 扩大击败拳击,拳击击败 Var-args。
- 你可以 Box 然后加宽(一个
int
可以成为Object
viaInteger
) - 你不能先加宽然后盒子(一个
int
不能成为Long
) - 您不能将 var-args 与加宽或装箱结合使用
因为两个构造函数都是 var-args(规则 7),所以编译器将退回到其他规则并选择使用最小类型的方法(规则 1)。
您可以使用以下代码确认此行为:
static class SomeClass {
SomeClass(long... value) { System.out.println("Long"); }
SomeClass(int... value) { System.out.println("Int"); }
SomeClass(byte... value) { System.out.println("Byte"); }
}
public static void main(String[] args) throws Exception {
SomeClass o = new SomeClass(); // Byte
}
JLS 4.10.1中解释了规则 1 中使用的基元类型之间的精确子类型关系。原始类型之间的子类型化。
以下规则定义了原始类型之间的直接超类型关系:
双 > 1浮点数
浮动 > 1长
长 > 1 个整数
整数 > 1 个字符
int > 1短
短 > 1字节
推荐阅读
- php - PayPal PayPalConnectionException 连接在 10001 毫秒后超时
- php - 如何更改mysql查询中的日期格式
- python - 无法在 PyCharm 中打开 csv 文件 找不到文件
- python - 使用 Selenium 以不一致的顺序处理数据以进行 Web 抓取
- c# - .net 核心 - MVC webapp 不会显示我的 JSON 集合
- python - python3.x - 尝试使用 zipfile 和 pathlib 模块打开目录时出现 PermissionError
- c++ - 求和 int 乘以 double 时的欠/过近似
- cordova - `cordova run --list` 导致 ECONNREFUSED
- node.js - 如何在 cPanel 上连接 node.js 后端和 react.js 前端?
- react-native - 在本机反应中传递元素的位置