用varargs重载方法的行为

时间:2013-04-27 12:25:33

标签: 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 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

1 个答案:

答案 0 :(得分:3)

这是一个错字

void varagrs(long... l){
         ^^ 

这就是为什么拥有带拼写检查的IDE(例如IntelliJ)

的好处

在修正拼写错误后,编译器选择(int...)而不是(long...),因为intlong (4.10.1)的子类型,因此第一种方法更具体(15.12.2.5)。请注意,int[]不是long[] (4.10.3)的子类型。