varargs 什么时候开始不与 no-arg 冲突?

When varargs started to not conflict with no-arg?

今天我发现下面的代码编译运行没有任何警告:

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 更改还是我的内存故障???

如何区分无参数和可变参数?

更新

下面的代码也运行正常:

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:

When a method is invoked (§15.12), the number of actual arguments (and any explicit type arguments) and the compile-time types of the arguments are used, at compile time, to determine the signature of the method that will be invoked (§15.12.2).

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

后端函数重载

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