当varargs开始与no-arg没有冲突时?

时间:2015-07-03 07:37:07

标签: java variadic-functions

今天我发现以下代码编译并运行时没有任何警告:

public class Try_MultipleArguments2 {

    public static void main(String[] args) {

        myfunction();

        myfunction(1, 2, 3);

    }

    public static void myfunction(int ... as) {
        System.out.println("varags called");
    }

    public static void myfunction() {
        System.out.println("noarg called");
    }
}

我清楚地记得,它不是那么早。

这个JVM是变化还是我的内存故障???

如何区分no-arg和varargs?

更新

以下代码也运行正常:

public class Try_MultipleArguments2 {

    public static void main(String[] args) {

        myfunction();

        myfunction(1, 2, 3);

    }

    public static void myfunction(int ... as) {
        System.out.println("varags called");
    }

//    public static void myfunction() {
//        System.out.println("noarg called");
//    }
}

2 个答案:

答案 0 :(得分:3)

这些是重载方法。编译器知道编译的main从方法签名中调用哪个方法。见this specification

  

当调用方法(第15.12节)时,在编译时使用实际参数的数量(以及任何显式类型参数)和参数的编译时类型来确定方法的签名。被调用(§15.12.2)。

此外,所选择的方法是最具体的方法。见this。在这种情况下,no-arg方法比varargs版本更具体 - 再次检查参数的数量以查看选择哪种方法。

答案 1 :(得分:-2)

它的后端函数重载。

void myfunction(int ... as)没有参数时,void myfunction()接受多个参数。我没有看到任何故障。 Method Overloading