我有两个带有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 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);
}
输出:
在长长的varargs里面 1
Inside static int varargs 1
编辑:我应该选择更好的方法名称。有一个错字varargs,varagrs。谢谢zhong.j.yu指出这一点。更正了代码和预期行为:
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);
}
输出:
内部的varargs 1
Inside static int varargs 1
答案 0 :(得分:3)
这是一个错字
void varagrs(long... l){
^^
这就是为什么拥有带拼写检查的IDE(例如IntelliJ)
的好处在修正拼写错误后,编译器选择(int...)
而不是(long...)
,因为int
是long
(4.10.1)的子类型,因此第一种方法更具体(15.12.2.5)。请注意,int[]
不是long[]
(4.10.3)的子类型。