2013-08-27 86 views
7

假設我有方法如何將參數添加到可變參數?

void m1(Object... objs) { 
    m2("added", objs); 
} 

void m2(Object... objs) { 
    for (Object o : objs) { 
     // do something with Object o 
    } 
} 

如果我請m1("a", "b"),我想m2看的3個對象的陣列(字符串 「加入」, 「一個」 和「b 「)。然而,相反m2只看到2個對象:字符串「已添加」和一個Object[]數組,其內部包含字符串「a」和「b」。

我怎樣才能得到想要的行爲,也就是在將元素轉發到其他方法之前,只需將元素添加到可變參數中?

+2

有很多方法可以解決這個問題,但是您的建議是「將元素簡單地添加到可變參數中,然後再將它們轉發到另一個方法」是完全可以接受的。 –

+4

http://stackoverflow.com/questions/11321784/how-to-add-new-element-to-varargs – JNL

+1

@JNL這不是重複的。 –

回答

8

可以編寫這樣的方法:

public static Object[] merge(Object o, Object... arr) { 
    Object[] newArray = new Object[arr.length + 1]; 
    newArray[0] = o; 
    System.arraycopy(arr, 0, newArray, 1, arr.length); 

    return newArray; 
} 

,隨後:

m2(merge("added", objs)); 
4

使用List,添加您的新元素,添加varagrs數組中的元素,然後將List轉換回數組。

void m1(Object... objs) { 
    List<Object> list = new ArrayList<>(); 
    list.add("added"); 
    list.addAll(Arrays.asList(objs)); 
    m2(list.toArray()); 
} 

隨着LinkedList你可以調用addFirst()

+3

好的解決方案,但它打破了他原來指定的順序。 'list.add(「added」);'應該在'list.addAll(...)'之前# – StormeHawke

+1

@StormeHawke是的,謝謝。編輯取決於實施。 –

1

可變參數在功能上與傳遞在陣列中,不同之處在於不要求用戶以構建陣列。根據docs,「最後一個參數可能會作爲參數序列」(原始斜體)作爲數組傳遞。因此,如果作爲參數序列傳遞,則數組由傳入的可變參數構造而成。

對於您的情況,您希望將某些內容添加到該數組中...因此您必須創建一個新數組:

void m1(Object... objs){ 
    Object[] newObjs = new Object[objs.length + 1]; 
    newObjs[0] = "added"; 
    System.arraycopy(objs, 0, newObjs, 1, objs.length); 
    m2(newObjs); 
}