【问题标题】:How to pass elements of an arrayList to variadic function如何将arrayList的元素传递给可变参数函数
【发布时间】:2012-09-14 02:41:56
【问题描述】:

我有一个充满元素的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 */ );

这样的事情可能吗?

提前致谢。

【问题讨论】:

    标签: java collections andengine variadic-functions


    【解决方案1】:

    只要做:

    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@1242719c 的内容(int[] 的默认toString 结果)。这是因为它最终会创建一个带有一个元素的Object[],即我们的int[],例如:

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

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

    【讨论】:

    • 正确,ofc,但每次我写这样的东西时,我都会畏缩 - 这样的句法纠结。
    • @SteveB。我同意,重载是一个比强制这种方法调用更好的选择,然后在幕后转换。虽然可变参数很好,但它们不能很好地处理集合。
    • 不只是纠结;所有不必要的(指针)复制都会影响性能。请参阅下面的答案以获得更便宜的方式。
    【解决方案2】:

    IEntityModifier...IEntityModifier[] 的语法糖

    参见appropriate JLS section8.4.1 形式参数

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 2023-01-21
        • 2015-09-05
        相关资源
        最近更新 更多