2013-08-27 50 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); 
}