22

我有一个充满元素的arrayList。我想将该数组列表的元素作为参数传递给可变参数函数。

我的功能

public SequenceEntityModifier(final IEntityModifier... pEntityModifiers)

我的数组列表

ArrayList<IEntityModifier> arr = new ArrayList<IEntityModifier>();
arr.add(new MoveXModifier(1, 50, 120));
arr.add(new MoveXModifier(1, 120, 50));

我想将它传递给函数,就好像我会单独传递它们一样。

new SequenceEntityModifier( /* elements of arr here */ );

这样的事情可能吗?

提前致谢。

4

3 回答 3

25

做就是了:

new SequenceEntityModifier(arr.toArray(new IEntityModifier[arr.size()]));

这会将 复制ArrayList到给定的数组并返回它。所有 vararg 函数也可以将数组作为参数,因此:

public void doSomething(Object... objs)

所有的合法电话是:

doSomething(); // Empty array
doSomething(obj1); // One element
doSomething(obj1, obj2); // Two elements
doSomething(new Object[] { obj1, obj2 }); // Two elements, but passed as array

一个警告:

涉及原始数组的 Vararg 调用不会像您期望的那样工作。例如:

public static void doSomething(Object... objs) {
    for (Object obj : objs) {
        System.out.println(obj);
    }
}

public static void main(String[] args) {
    int[] intArray = {1, 2, 3};
    doSomething(intArray);
}

人们可能希望这会在不同的行上打印1,2和, 。3相反,它会打印类似的东西[I@1242719c(an 的默认toString结果int[])。这是因为它最终创建了一个Object[]带有一个元素的元素,即我们的int[],例如:

// Basically what the code above was doing
Object[] objs = new Object[] { intArray };

double[],char[]和其他原始数组类型也是如此。请注意,这可以通过将类型更改为intArray来解决Integer[]。如果您正在使用现有数组,这可能并不简单,因为您无法将 anint[]直接转换为 an Integer[](请参阅这个问题,我特别喜欢Apache Commons LangArrayUtils.toObject的方法)。

于 2012-09-21T16:38:30.180 回答
3

该构造IEntityModifier...是语法糖IEntityModifier[]

请参阅相应的 JLS 部分8.4.1 形式参数

于 2012-09-21T16:38:34.427 回答
3

我总是创建一个需要 的重载Iterable< ? extends IEntityModifier >,并使用 将可变参数版本转发到这个版本Arrays.asList(),这很便宜。

于 2012-09-21T16:52:02.783 回答