9

メソッドがあるとします

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

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

を呼び出すとm1("a", "b")m23 つのオブジェクト (文字列「追加」、「a」、および「b」) の配列が表示されます。ただし、代わりに、m2文字列「追加」と、文字列「Object[]a」および「b」を内部に含む配列の 2 つのオブジェクトのみが表示されます。

目的の動作を得るにはどうすればよいでしょうか。つまり、要素を別のメソッドに転送する前に varargs に要素を追加するだけです。

4

3 に答える 3

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));
于 2013-08-27T20:56:35.773 に答える
1

Varargs は、ユーザーが配列を作成する必要がないことを除いて、機能的には配列を渡すのと同じです。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);
}
于 2013-08-27T21:00:52.917 に答える