【问题标题】:Behavior of method overloading with varargs使用可变参数重载方法的行为
【发布时间】:2013-04-27 12:25:33
【问题描述】:

我有两个使用 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);
}

输出:

在长可变参数内 1

内部静态 int 可变参数 1

编辑:我应该选择更好的方法名称。有一个错字可变参数,可变参数。感谢 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);
}

输出:

内部 int 可变参数 1

内部静态 int 可变参数 1

【问题讨论】:

标签: java overloading variadic-functions


【解决方案1】:

打错字了

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

这就是为什么拥有一个带有拼写检查功能的 IDE(例如 IntelliJ)会很好的原因

修正错字后,编译器选择(int...)而不是(long...),因为int是long(4.10.1)的子类型,所以第一种方法更具体(15.12.2.5)。请注意虽然int[] 不是long[] (4.10.3) 的子类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多