1

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

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();
}
4

1 回答 1

4

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

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

这确保了一个方法永远不会通过可变的方法调用来选择,如果它可以通过固定的方法调用来应用的话。

第三阶段(第 15.12.2.4 节)允许将重载与可变参数方法、装箱和拆箱相结合。

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

于 2013-10-15T21:40:12.727 回答