我想知道为什么在 Java 中不允许用 Foo(Object... args)
重载 Foo(Object[] args)
,尽管它们被使用以不同的方式?
Foo(Object[] args){}
用法如下:
Foo(new Object[]{new Object(), new Object()});
而另一种形式:
Foo(Object... args){}
用法如下:
Foo(new Object(), new Object());
这背后有什么原因吗?
最佳答案
这15.12.2.5 Choosing the Most Specific Method谈论这个,但它很复杂。例如在 Foo(Number... ints) 和 Foo(Integer... ints) 之间进行选择
为了向后兼容,这些实际上是同一件事。
public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){}
// calls the varargs method.
Foo(new Object[]{new Object(), new Object()});
例如您可以将 main() 定义为
public static void main(String... args) {
使它们不同的一种方法是在可变参数之前采用一个参数
public Foo(Object o, Object... os){}
public Foo(Object[] os) {}
Foo(new Object(), new Object()); // calls the first.
Foo(new Object[]{new Object(), new Object()}); // calls the second.
它们并不完全相同。细微差别在于,虽然您可以将数组传递给可变参数,但您不能将数组参数视为可变参数。
public Foo(Object... os){}
public Bar(Object[] os) {}
Foo(new Object[]{new Object(), new Object()}); // compiles fine.
Bar(new Object(), new Object()); // Fails to compile.
此外,可变参数必须是最后一个参数。
public Foo(Object... os, int i){} // fails to compile.
public Bar(Object[] os, int i) {} // compiles ok.
关于java - 为什么在 Java 中不允许用 Foo(Object[]) 重载 Foo(Object...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8838339/