Java 使用varargs重载方法的行为
我有两个重载方法,分别是varargs int和long。当我运行传递整数的测试时,它似乎更喜欢varargs long方法。然而,如果我将这些方法设置为静态并使用整数运行,那么它似乎更喜欢varargs int方法。这是怎么回事Java 使用varargs重载方法的行为,java,overloading,variadic-functions,Java,Overloading,Variadic Functions,我有两个重载方法,分别是varargs int和long。当我运行传递整数的测试时,它似乎更喜欢varargs long方法。然而,如果我将这些方法设置为静态并使用整数运行,那么它似乎更喜欢varargs int方法。这是怎么回事 void varargs(int... i){ System.out.println("Inside int varargs"); for(int x : i) System.out.println(x); } void varag
void varargs(int... i){
System.out.println("Inside int varargs");
for(int x : i)
System.out.println(x);
}
void varagrs(long... l){
System.out.println("Inside long varargs");
for(long x : l)
System.out.println(x);
}
static void staticvarargs(int...i)
{
System.out.println("Inside static int varargs");
for(int x : i)
System.out.println(x);
}
static void staticvarargs(long...l)
{
System.out.println("Inside static long varargs");
for(long x : l)
System.out.println(x);
}
public static void main(String args[]){
VarArgs va = new VarArgs();
va.varagrs(1);
staticvarargs(1);
}
输出:
长瓦拉格内
一,
内部静态int varargs
一,
编辑:我应该选择更好的方法名。有一个拼写错误varargs,varagrs。谢谢钟杰瑜指出这一点
更正的代码和预期行为:
void varargs(int... i){
System.out.println("Inside int varargs");
for(int x : i)
System.out.println(x);
}
void varargs(long... l){
System.out.println("Inside long varargs");
for(long x : l)
System.out.println(x);
}
static void staticvarargs(int...i)
{
System.out.println("Inside static int varargs");
for(int x : i)
System.out.println(x);
}
static void staticvarargs(long...l)
{
System.out.println("Inside static long varargs");
for(long x : l)
System.out.println(x);
}
public static void main(String args[]){
VarArgs va = new VarArgs();
va.varargs(1);
staticvarargs(1);
}
输出:
内部int varargs
一,
内部静态int varargs
这是个打字错误
void varagrs(long... l){
^^
这就是为什么有一个带有拼写检查的IDE(例如IntelliJ)很好
修复打字错误后,编译器选择
(int…)
而不是(long…
,因为int
是long
的子类型,所以第一种方法更具体。注意:虽然int[]
不是long[]
的子类型,但我无法解释其行为,这可能是一种混乱,促使Oracle明确表示vararg方法没有重载。@Evgeny这是另一个问题,不是吗?是的,为了完整性而添加了它