22

要素で満たされた 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 */ );

このようなことは可能ですか?

前もって感謝します。

4

3 に答える 3

25

ただ行う:

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

1 つの警告:

プリミティブ配列を含む 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これは、 、2、および3を別々の行に出力すると予想されるかもしれません。[I@1242719c代わりに、 (のデフォルトのtoString結果)のようなものを出力しますint[]。これは、最終的にObject[]を 1 つの要素で作成しているためです。これは私たちのint[]です。例:

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

double[]、 、およびその他のプリミティブchar[]配列型についても同様です。intArrayこれは、 のタイプをに変更するだけで修正できることに注意してくださいInteger[]int[]を に直接キャストできないため、既存の配列を使用している場合、これは簡単ではないかもしれません(この質問Integer[]を参照してください。Apache Commons Langのメソッドが特に好きです)。ArrayUtils.toObject

于 2012-09-21T16:38:30.180 に答える
3

私は常に を取るオーバーロードを作成し、 をIterable< ? extends IEntityModifier >使用して可変引数バージョンをこれに転送しArrays.asList()ます。これは安価です。

于 2012-09-21T16:52:02.783 に答える
3

構文IEntityModifier...は構文糖衣ですIEntityModifier[]

該当する JLS セクションを参照してください( 8.4.1 Formal Parameters ) 。

于 2012-09-21T16:38:34.427 に答える