Java 编译器如何识别要使用的重载方法?

Java 编译器如何识别要使用的重载方法?,java,overload-resolution,Java,Overload Resolution,假设我有以下两个方法声明 public void foo() {/* do something */ } public void foo(String...args) {/* do something else */} 那么当我调用foo()时,Java怎么知道我要调用第一个呢?据我所知,我可能是指第二个。因为下面的方法很好用 public void bar(String...args) {} public void callBar() { // call bar() with no

假设我有以下两个方法声明

public void foo() {/* do something */ }
public void foo(String...args) {/* do something else */}
那么当我调用
foo()
时,Java怎么知道我要调用第一个呢?据我所知,我可能是指第二个。因为下面的方法很好用

public void bar(String...args) {}
public void callBar()
{
    // call bar() with no arguments. 
     bar();
}
根据,具有可变参数的构造函数具有最低优先级。如果可以在不使用varargs方法的情况下定义调用,那么它将使用该方法

第二阶段(§15.12.2.3)在允许装箱和拆箱的同时执行重载解析,但仍然禁止使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段

这确保了如果方法通过固定arity方法调用适用,则永远不会通过变量arity方法调用选择该方法

第三阶段(§15.12.2.4)允许重载与可变算术方法、装箱和拆箱相结合

其中“variable arity”指的是varargs参数。可以找到更多信息。

根据,具有可变参数的构造函数具有最低优先级。如果可以在不使用varargs方法的情况下定义调用,那么它将使用该方法

第二阶段(§15.12.2.3)在允许装箱和拆箱的同时执行重载解析,但仍然禁止使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段

这确保了如果方法通过固定arity方法调用适用,则永远不会通过变量arity方法调用选择该方法

第三阶段(§15.12.2.4)允许重载与可变算术方法、装箱和拆箱相结合


其中“variable arity”指的是varargs参数。可以找到更多信息。

啊,这只是一个惯例/规则?是的,这是JLS的定义。啊,这只是一个惯例/规则?是的,这是JLS的定义。吉特曼对昨天的回答解释得非常好。吉特曼对昨天的回答解释得非常好。