7

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

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

public void method(int x, String... things) {
    //...
}

我很惊讶这个编译,如果我调用

method(3);

然后它会选择第一个。显然,这在某种意义上是自然选择的方法,但如果第一种方法不存在,这将是调用第二种方法的合理方法(使用空的可变参数数组)。那么它肯定应该被认为是模棱两可的并产生编译时错误吗?

还是将其视为特殊情况?

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

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

4

2 回答 2

10

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

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

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

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

于 2015-08-12T14:21:15.130 回答
0

第一种方法的参数类型是

int x

第二种方法的参数类型是

int x, String[] things

因此这两种方法没有相同的签名并且没有歧义。@Glorfindel 解释了 Java 如何决定调用哪个方法,但是如果您想在没有 any 的情况下调用第二种方法things,您可以传入一个空数组。

method(6, new String[0]);
于 2015-08-12T14:20:19.113 回答