假设我有方法
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个对象:字符串“已添加”和Object[]
数组,其内部包含字符串“a”和“b”。
我如何获得所需的行为,也就是说,我只是在将它们转发给另一种方法之前向varargs添加元素?
答案 0 :(得分: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));
答案 1 :(得分: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()
。
答案 2 :(得分:1)
Varargs在功能上与传入数组相同,只是用户不需要构造数组。根据{{3}},“最终参数可以作为数组或作为参数序列”(原始斜体)。因此,如果作为参数序列传递,则数组是从传入的变量参数构造的。
在您的情况下,您想要向该数组添加内容...因此您必须创建一个新数组:
void m1(Object... objs){
Object[] newObjs = new Object[objs.length + 1];
newObjs[0] = "added";
System.arraycopy(objs, 0, newObjs, 1, objs.length);
m2(newObjs);
}