Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用varargs重载方法的行为_Java_Overloading_Variadic Functions - Fatal编程技术网

Java 使用varargs重载方法的行为

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

我有两个重载方法,分别是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);
}
输出:

长瓦拉格内 一,

内部静态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这是另一个问题,不是吗?是的,为了完整性而添加了它