2013-08-27 14 views
7

私はm1("a", "b")を呼び出すと、私は "追加" 3つのオブジェクト(文字列、 "a" と「bの配列を確認するためにm2をたい方法引数をvarargsに追加する方法は?

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

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

を持っていると仮定")。しかし、代わりにm2には文字列 "added"とObject[]という2つのオブジェクトがあり、内部的に文字列 "a"と "b"が含まれています。

どのようにして目的の動作を得ることができますか?すなわち、要素を別のメソッドに転送する前に要素をvarargsに追加するだけですか?

+2

これを回避する方法はたくさんありますが、「別の方法に転送する前に要素をvarargsに追加する」という提案は完全に受け入れられます。 –

+4

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

+1

@JNLこれは複製ではありません。 –

答えて

8

次のようなメソッドを書くことができます

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

Listを使用して、新しい要素を追加し、varagrs配列から要素を追加して、Listを配列に戻します。 LinkedList

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

あなたはaddFirst()を呼び出すことができます。その後、

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; 
} 

と::

+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); 
} 
関連する問題