9

假设我有方法

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 个对象的数组(字符串“添加”、“a”和“b”)。但是,它只m2看到 2 个对象:字符串“add”和一个Object[]数组,该数组内部包含字符串“a”和“b”。

如何获得所需的行为,也就是说,我只需将元素添加到可变参数,然后再将它们转发到另一个方法?

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 回答
5

使用 a 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()

于 2013-08-27T20:55:04.923 回答
1

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);
}
于 2013-08-27T21:00:52.917 回答