Java 如何向varargs添加参数?

Java 如何向varargs添加参数?,java,variadic-functions,Java,Variadic Functions,假设我有办法 void m1(Object... objs) { m2("added", objs); } 及 如果我调用m1(“a”、“b”),我希望m2看到一个由3个对象组成的数组(字符串“添加”、“a”和“b”)。但是,m2只看到两个对象:字符串“added”和Object[]数组,数组内部包含字符串“a”和“b” 如何获得所需的行为,即在将元素转发到另一个方法之前向varargs添加元素?使用列表,添加新元素,从varagrs数组添加元素,然后将列表转换回数组 void m1(O

假设我有办法

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

如果我调用
m1(“a”、“b”)
,我希望
m2
看到一个由3个对象组成的数组(字符串“添加”、“a”和“b”)。但是,
m2
只看到两个对象:字符串“added”和
Object[]
数组,数组内部包含字符串“a”和“b”


如何获得所需的行为,即在将元素转发到另一个方法之前向varargs添加元素?

使用
列表
,添加新元素,从varagrs数组添加元素,然后将
列表
转换回数组

void m1(Object... objs) {
    List<Object> list = new ArrayList<>();
    list.add("added");
    list.addAll(Arrays.asList(objs));
    m2(list.toArray());
}
void m1(对象…对象){
列表=新的ArrayList();
列表。添加(“添加”);
addAll(Arrays.asList(objs));
m2(list.toArray());
}

使用
LinkedList
可以调用
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;
}
随后:

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

Varargs在功能上与传入数组相同,只是不要求用户构造数组。根据“最终参数可以作为数组或参数序列传递”(原始斜体)。因此,如果作为参数序列传递,则数组将从传入的变量参数构造

在您的情况下,您希望向该数组添加一些内容。。。因此,您必须创建一个新阵列:

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

有很多方法可以解决这个问题,但您的建议“在将元素转发到另一个方法之前,只需将元素添加到varargs中”是完全可以接受的。@JNL这不是重复的。基本上,直接使用数组进行操作。@RohitJain I从未说过这是重复的。我在帮OP问一个类似的问题。我认为这会有帮助。很好的解决方案,但是它打破了他最初指定的顺序<代码>列表。添加(“添加”)应该放在列表的前面。addAll(…)@StormeHawke是的,谢谢。根据实施情况进行编辑。
void m1(Object... objs){
  Object[] newObjs = new Object[objs.length + 1];
  newObjs[0] = "added";
  System.arraycopy(objs, 0, newObjs, 1, objs.length);
  m2(newObjs);
}