Java 同一符号的可变函数参数和非可变函数,哪个将运行?

Java 同一符号的可变函数参数和非可变函数,哪个将运行?,java,compilation,Java,Compilation,我刚刚测试了以下场景和两个函数: // method A private void make(Object ...objects ){ System.out.println("varargs make"); } // method B private void make(){ System.out.println("non varargs make"); } 通过调用make() 如果代码中只存在这两个方法中的一个,那么它就是被调用的方法。 但是,当两个方法都存在时,只调用方

我刚刚测试了以下场景和两个函数:

// method A
private void make(Object ...objects ){
    System.out.println("varargs make");
}

// method B
private void make(){
    System.out.println("non varargs make");
}
通过调用
make()

如果代码中只存在这两个方法中的一个,那么它就是被调用的方法。 但是,当两个方法都存在时,只调用方法B

我还有两个理论问题和一个实践问题

1) 是什么使编译器“偏爱”B而不是A

2) 这是故意的(标准的)还是编译器实现的结果

3) 有没有办法“强制”编译器调用方法a

1) 是什么使编译器“偏爱”B而不是A

JLS规范。它支持最具体的匹配(并有关于这意味着什么的规则)

2) 这是故意的(标准的)还是编译器实现的结果

是故意的

3) 有没有办法“强制”编译器调用方法a

给出一个对象数组,空数组或其他数组

make(new Object[0]);
1) 是什么使编译器“偏爱”B而不是A

JLS规范。它支持最具体的匹配(并有关于这意味着什么的规则)

2) 这是故意的(标准的)还是编译器实现的结果

是故意的

3) 有没有办法“强制”编译器调用方法a

给出一个对象数组,空数组或其他数组

make(new Object[0]);

答案是3。可能不是。。。除非将方法B编码为
make(新对象[0])
。可能不是。。。除非将方法B编码为
make(新对象[0])