繁体   English   中英

用varargs重载方法的行为

[英]Behavior of method overloading with varargs

我有两个重载方法,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

内部静态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);
}

输出:

在int varargs 1

内部静态int varargs 1

这是一个错字

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

这就是为什么有一个带拼写检查的IDE很好(例如IntelliJ)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM