2013-02-11 64 views
2

爲什麼在編譯時這個聲明不被認爲是模糊的?爲什麼一個參數被任意數量的參數版本重載的方法編譯

void f(int a) { 
    System.out.println("int"); 
} 
void f(int... a) { 
    System.out.println("int..."); 
} 

例如爲:

f(2);  // to one parameter both method should match (f(int) runs) 
f(2,2); // f(int...) 
+3

我沒有時間去找它,但我敢打賭,答案是在[JLS第15.12.2節](http://docs.oracle.com/javase/specs/jls/se7/html /jls-15.html#jls-15.12.2)。 – 2013-02-11 09:25:38

+0

那麼,如果編譯器能夠找到調用的完全匹配,那麼它就會這樣做,而不是var-args甚至是裝箱。 – 2013-02-11 09:28:06

回答

3

我認爲蔡炯輝VAR-ARGS聲明後面實際上被轉換成由編譯器的陣列。所以使用var-ARGS作爲參數的方法將實際上看起來象下面這樣:

void f(int[] a) { 
    System.out.println("int..."); 
} 
+0

如果存在像_void f(int [] a)_的方法會怎麼樣? – Juvanis 2013-02-11 09:22:44

+1

@Juvanis,那麼它不會編譯。 – svz 2013-02-11 09:24:24

+0

@Juvanis如果你有一個數組作爲參數的方法,另一個方法與var-args具有相同的名稱,因爲它是一個編譯器錯誤。模棱兩可的方法 – PermGenError 2013-02-11 09:24:36

0
void f(int... a) { 
System.out.println("int..."); 

}

上述方法可以接受一個或多個值和僅含有一個參數即

該方法
void f(int a) { 
System.out.println("int"); 

} 也可以接受一個值。