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

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

我的function

public SequenceEntityModifier(final IEntityModifier... pEntityModifiers) 

我的ArrayList

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

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

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

这样的事情可能吗?

提前致谢。

做就是了:

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

人们可能希望这在单独的行上打印13 。 相反,它打印的内容类似于[I@1242719cint[]的默认toString结果)。 这是因为它最终创建了一个带有一个元素的Object[] ,这是我们的int[] ,例如:

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

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

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

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

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