如何将arrayList的元素传递给variadic函数

时间:2012-09-21 16:34:47

标签: java collections andengine variadic-functions

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

我的功能

public SequenceEntityModifier(final IEntityModifier... pEntityModifiers)

我的ArrayList

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 */ );

这样的事情可能吗?

提前致谢。

3 个答案:

答案 0 :(得分:22)

只是做:

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);
}

有人可能希望在不同的行上打印123。相反,它打印的内容类似于[I@1242719ctoString的默认int[]结果。这是因为它最终创建了一个Object[],其中包含一个元素,即int[],例如:

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

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

答案 1 :(得分:3)

构造IEntityModifier...IEntityModifier[]

的语法糖

请参阅appropriate JLS section 8.4.1正式参数

答案 2 :(得分:3)

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