java - 为什么这不会产生歧义?

标签 java overloading javac variadic-functions ambiguous-call

<分区>

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

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

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

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

method(3);

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

或者这是否被视为特殊情况?

这样对待它似乎是错误的,因为这意味着添加新方法可能会破坏现有代码,这不是一件很愉快的事情。

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

最佳答案

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

The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.

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

The third phase (§15.12.2.4) allows overloading to be combined with variable arity methods, boxing, and unboxing.

关于java - 为什么这不会产生歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31967813/

相关文章:

java - 使用 jaxb 解码元素属性和文本以分隔字段

具有方法重写的 C++ 继承

c++ - 运算符 << 和 >> 重载

java - 关于java的5个问题

Javac 无法正常工作或者我做错了什么?

java - 为什么我们需要让javac来编译多个源文件?

java - JDeveloper POJO Web 服务 FileNotFoundException

java - 使用 openid4java 进行 'login with google' 时验证失败

java - 我们可以以编程方式更改状态栏或通知栏位置吗

scala - 如果我在 Scala 中定义多个重载构造函数,我不能定义默认值吗?