2012-01-12 118 views
13

我想知道爲什麼在Java中不允許將Foo(Object[] args)Foo(Object... args)重載,儘管它們以不同的方式使用?爲什麼Java中不允許用Foo(Object [])重載Foo(Object ...)?

Foo(Object[] args){} 

使用,如:

Foo(new Object[]{new Object(), new Object()}); 

,而其他形式:

Foo(Object... args){} 

使用,如:

Foo(new Object(), new Object()); 

沒有任何理由的背後呢?

+0

有趣的問題+1 – mKorbel 2012-01-12 17:57:48

+1

我可能錯過了一些東西,但爲什麼你需要超載?如果您將方法聲明爲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

+0

vararg只是將方法簽名轉換爲最後聲明的數組(如'int []'或'Object []')爲可變類型的標誌。除此之外 - 方法簽名沒有區別。同樣的問題就是不能重載'private'和'public'方法。 – bestsss 2012-01-15 10:07:15

回答

25

這個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. 
+0

+1很好的解釋。有沒有爲此編寫的語言規範? – 2012-01-12 16:22:17

+0

:-)好的答案+1 – mKorbel 2012-01-12 17:57:26

+0

對[這個問題]看看(http://stackoverflow.com/q/14937948/597657)請。 – 2013-02-18 14:15:52

3

問題最直接的答案是,這兩個聲明都會在方法查找邏輯中產生一個模糊性。

Object[] a = new Object[10]; 
Foo(a); // array or vararg? 

而Java需要有永遠是所有方法調用最具體的方法:如果你在同一個類中聲明這兩個,稱正是如此什麼時候就沒有辦法弄清楚你想要哪種方法。 對於爲什麼,請參閱彼得的答案。

+0

他們*完全相同,而不是含糊不清,他們不能存在於同一個班級 – bestsss 2012-01-15 10:07:50