【发布时间】:2016-04-13 20:32:59
【问题描述】:
我刚刚写了一些结构如下的代码:
public void method(int x) {
//...
}
public void method(int x, String... things) {
//...
}
我很惊讶这个编译了,如果我调用了
method(3);
然后它会选择第一个。显然这在某种意义上是自然选择的方法,但如果第一种方法不存在,这将是调用第二种方法的合理方法(使用空的可变参数数组)。那么它肯定应该被认为是模棱两可的并产生编译时错误吗?
或者这是否被视为特殊情况?
这样对待它似乎是错误的,因为这意味着添加一个新方法可能会破坏现有代码,这不是一个非常愉快的事情。
(天知道如果第一个被添加为包含第二个的子类的新方法,你最终会调用哪个......)
【问题讨论】:
-
你调用了一个有1个参数的方法,为什么它会调用一个需要2个参数的方法?
-
@loli 因为没有一个需要两个。第二个有一个可变参数,这意味着
String...部分可以接受任意数量的参数,包括零。 -
@chiastic-security 啊我不知道那是Java等价物,我以为你写的......因为你懒得在键盘上找到[]
-
vararg 方法是在 java5 中引入的比较晚。他们不希望现有代码受其影响,因此在方法解析期间可变参数方法的优先级较低。
标签: java overloading javac variadic-functions ambiguous-call