如何将数组列表的元素传递给可变参数函数

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

我的函数

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

这样的事情可能吗?

提前致谢。


答案 1

只需做:

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

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

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@1242719ctoStringint[]Object[]int[]

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

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


答案 2

该结构是句法糖IEntityModifier...IEntityModifier[]

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