2015-11-01 45 views
11

我知道Java「...」數組參數的語法可以接受一個數組作爲參數,或者只是傳遞給該方法的許多參數。然而,我注意到,它集合這樣做太:Java自動將集合轉換爲參數數組?

public static void main(String[] args) { 
    Collection<Object> objects = new ArrayList<>(); 
    test(objects); 
} 

public static void test (Object...objects) { 
    System.out.println("no compile errors"); 
} 

這編譯和運行,而不需要我打電話給toArray()方法。現場發生了什麼?這種語法是否有其他的「自動轉換」方法?

順便說一句,我正在使用Java 1.7。

回答

12

它不會將集合轉換爲數組。它通過收集本身作爲第一個可變參數。測試方法因此接收一個元素的數組,這個元素是ArrayList。

這可以很容易地通過更換

System.out.println("no compile errors"); 

通過

System.out.println(Arrays.toString(objects); 

或使用調試器中找到。

4

一個Collection<Object>也是Object因此,當你調用test

Collection<Object> objects = new ArrayList<>(); 
test(objects); 

它會與你收集一個參數來調用:該方法將得到具有單個元素的數組。

4

這裏發生的是該方法接收長度爲1的數組,其中包含一個單獨的Collection

大部分時間,簽名

method(Object... objs) 

應該避免,因爲它會接受任何參數序列,甚至是原語,因爲這些獲得自動裝箱。

+0

謝謝。沒有這樣想過...... – Ozilophile