如何将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); }
人们可能希望这在单独的行上打印1
和3
。 相反,它打印的内容类似于[I@1242719c
( int[]
的默认toString
结果)。 这是因为它最终创建了一个带有一个元素的Object[]
,这是我们的int[]
,例如:
// Basically what the code above was doing Object[] objs = new Object[] { intArray };
double[]
, char[]
和其他原始数组类型也是如此。 请注意,只需将intArray
的类型intArray
为Integer[]
。 如果您正在使用现有数组,这可能并不简单,因为您无法将int[]
直接转换为Integer[]
(请参阅此问题 ,我特别喜欢Apache Commons Lang中的ArrayUtils.toObject
方法)。
构造IEntityModifier...
是IEntityModifier[]
语法糖
请参阅相应的JLS部分 ( 8.4.1正式参数 )
我总是创建一个带Iterable< ? extends IEntityModifier >
的重载Iterable< ? extends IEntityModifier >
Iterable< ? extends IEntityModifier >
,并使用Arrays.asList()
将可变版本转发到此版本,这很便宜。