Java 重载var args
谁能解释为什么第一种方法比第二种更可取 我知道重载的规则(除了首先编译器找到合适的参数)Java 重载var args,java,overloading,variadic-functions,Java,Overloading,Variadic Functions,谁能解释为什么第一种方法比第二种更可取 我知道重载的规则(除了首先编译器找到合适的参数) 加宽 自动装箱 变量args 代码: 控制台:对象…Java中的方法解析规则要求在尝试匹配这些功能之前,在不使用自动(取消)装箱和变量arity的情况下尝试匹配。这确保了源代码与这些功能之前的语言版本的兼容性 JLS(§15.12.2)中描述了过载解决的规则: 确定适用性的过程从确定潜在的 适用方法(§15.12.2.1) 该过程的其余部分分为三个阶段,以确保与 JavaSE5.0之前的Java编程语言版本
控制台:
对象…
Java中的方法解析规则要求在尝试匹配这些功能之前,在不使用自动(取消)装箱和变量arity的情况下尝试匹配。这确保了源代码与这些功能之前的语言版本的兼容性
JLS(§15.12.2)中描述了过载解决的规则:
确定适用性的过程从确定潜在的
适用方法(§15.12.2.1)
该过程的其余部分分为三个阶段,以确保与
JavaSE5.0之前的Java编程语言版本。这些阶段是:
在您的示例中,在步骤1中有两种候选方法:带有
对象[]
参数的方法和带有整数[]
参数的方法。调用站点的参数类型为Integer[]
。由于对象[]
可从整数[]
赋值,但整数[][]
不可赋值,因此找到了一个适用的方法,重载解析在此停止。在这种情况下,永远不会达到第2步和第3步。Mike是正确的;有三个阶段,
15.12.2.2。阶段1:通过子类型识别适用的匹配Arity方法
15.12.2.3。阶段2:通过方法调用转换识别适用的匹配Arity方法
15.12.2.4。阶段3:确定适用的变量算术方法
show(Object[])
在第一阶段被选中,但是show(Integer[])
只能在第三阶段被选中
如果第一个方法签名更改为show(Object[]…args)
,您将看到预期的结果
如果第二个方法签名更改为show(Integer…args)
,您还将看到预期的结果。该方法也适用于第1阶段,它比show(Object…)
如果我们有
public static void show(Object ... args){
System.out.println("Object ...");
}
static class IntArray{}
public static void show(IntArray ... args){
System.out.println("IntArray ...");
}
show(new IntArray());
它将在阵列中打印所需的。
。此处IntArray
不是对象[]
的子类型
这太令人困惑了。程序员通常不知道这些阶段;他们考虑所有适用的方法,以及其中最具体的方法。如果规范也这样做,可能会更好。您的var arg为
Integer[]
。所以是多个数组,而不是多个整数。Var-arg Integer[]。。。args可以接受整数[],为什么不这样做?我认为这比用对象调用show更明显。。。params.@SotiriosDelimanolis“多个”数组表示0个或多个数组。单个Integer[]
对于担任不同角色的Integer[].
和Integer…
都是可以接受的。
public static void show(Object ... args){
System.out.println("Object ...");
}
static class IntArray{}
public static void show(IntArray ... args){
System.out.println("IntArray ...");
}
show(new IntArray());