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

时间:2013-10-15 21:38:16

标签: 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 arguments. 
     bar();
}

1 个答案:

答案 0 :(得分:4)

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

  

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

     

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

     

第三阶段(§15.12.2.4)允许重载与变量arity方法,装箱和拆箱相结合。

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