为什么这不会产生歧义?

chi*_*ity 6 java overloading javac variadic-functions ambiguous-call

我刚刚写了一些具有以下结构的代码:

public void method(int x) {
    //...
}

public void method(int x, String... things) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

我很惊讶这编译了,如果我调用的话

method(3);
Run Code Online (Sandbox Code Playgroud)

然后它会选择第一个.显然,这在某种意义上是自然选择的,但如果第一种方法不存在,这将是调用第二种方法的合理方式(使用空的varargs数组).所以它应该被认为是模糊的并产生编译时错误?

或者这被视为特例?

这样对待它似乎是错误的,因为这意味着添加新方法可能会破坏现有代码,这不是一个非常幸福的事态.

(Goodness只知道如果第一个被添加为包含第二个子类的子类的新方法,你最终会调用哪个...)

Glo*_*del 10

根据Java语言规范的第15章,搜索适用的方法分三个阶段完成.

第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第二阶段.

因此,第一种方法已被认为适用于第一阶段.其余阶段被跳过; String ...方法只会在第三阶段考虑:

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