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

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");
//    }
}

最佳答案

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


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


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

关于java - 当varargs开始不与no-arg冲突时?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31201196/

10-10 02:50