2012-09-21 175 views
16

我已經有了一個用元素填充的arrayList。我想將該數組列表的元素作爲參數傳遞給可變參數函數。如何將arrayList的元素傳遞給可變參數函數

我的功能

public SequenceEntityModifier(final IEntityModifier... pEntityModifiers) 

我的ArrayList

ArrayList<IEntityModifier> arr = new ArrayList<IEntityModifier>(); 
arr.add(new MoveXModifier(1, 50, 120)); 
arr.add(new MoveXModifier(1, 120, 50)); 

我想將它傳遞給函數,如果我會單獨通過他們。

new SequenceEntityModifier(/* elements of arr here */); 

是這樣的可能嗎?

在此先感謝。

回答

21

只要做到:

new SequenceEntityModifier(arr.toArray(new IEntityModifier[arr.size()])); 

這將複製ArrayList給定數組中,並返回。所有的可變參數的功能也可以採取陣列的說法,所以:

public void doSomething(Object... objs) 

所有法律電話是:

doSomething(); // Empty array 
doSomething(obj1); // One element 
doSomething(obj1, obj2); // Two elements 
doSomething(new Object[] { obj1, obj2 }); // Two elements, but passed as array 

警告:

VARARG呼籲涉及基本數組別不會像你期望的那樣工作。例如:

public static void doSomething(Object... objs) { 
    for (Object obj : objs) { 
     System.out.println(obj); 
    } 
} 

public static void main(String[] args) { 
    int[] intArray = {1, 2, 3}; 
    doSomething(intArray); 
} 

人們可能期望這個打印123,在不同的行。相反,它會輸出類似[[email protected]int[]的默認toString結果)。這是因爲它最終與一個元素,這是我們int[],例如:

// Basically what the code above was doing 
Object[] objs = new Object[] { intArray }; 

也是一樣double[]char[],等原始數組類型創建Object[]。請注意,只需將intArray的類型更改爲Integer[]即可解決此問題。這可能並不簡單,因爲您無法直接將int[]投射到Integer[](請參閱this question,我特別喜歡Apache Commons LangArrayUtils.toObject方法),因此如果您正在使用現有陣列,這可能並不簡單。

+1

正確,ofc,但每次我寫這樣的東西我都畏縮 - 這種句法糾結。 –

+0

完美,非常感謝! – pad

+0

@SteveB。我同意,重載是比強制這種方法調用更好的選擇,然後在幕後轉換。雖然可變參數很好,但它們在收藏方面表現不佳。 – Brian

3

我總是創造一個重載需要Iterable< ? extends IEntityModifier >,使一個可變版本,期待這一個使用Arrays.asList(),這很便宜。

+0

現在我可以「一行」它,thx! –

相關問題