這個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.
此外,varags必須是最後一個參數。
public Foo(Object... os, int i){} // fails to compile.
public Bar(Object[] os, int i) {} // compiles ok.
有趣的問題+1 – mKorbel 2012-01-12 17:57:48
我可能錯過了一些東西,但爲什麼你需要超載?如果您將方法聲明爲void foo(Object ... args),那麼您可以使用** foo(new Object(),new Object())**或**'foo( new Object [] {new Object(),new Object()})'並得到相同的結果。有關示例,請參閱[與此相關的問題](http://stackoverflow.com/questions/1656901/varargs-and-the-argument)。 – 2012-01-12 18:26:19
vararg只是將方法簽名轉換爲最後聲明的數組(如'int []'或'Object []')爲可變類型的標誌。除此之外 - 方法簽名沒有區別。同樣的問題就是不能重載'private'和'public'方法。 – bestsss 2012-01-15 10:07:15