2012-09-21 11 views
16

要素でいっぱいのarrayListがあります。私はその配列リストの要素をバリデーション関数の引数として渡したいと思います。arrayListの要素をvariadic関数に渡す方法

My機能

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

このようなことはありますか?

ありがとうございます。

答えて

21

だけで実行します。与えられた配列に

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

このコピー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 

1つの警告:

可変引数がプリミティブ配列ドン関与呼び出します」あなたが期待するように働きます。たとえば:

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

一つは、これは別の行に、12、および3を印刷するように期待するかもしれません。代わりに、[[email protected]int[]のデフォルトのtoStringの結果)のような内容が表示されます。それは最終的には例えば、私たちのint[]ある一つの要素、とObject[]を作成していますので、これがある:

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

同じdouble[]char[]のために行くと、他のプリミティブ配列の型。これは、intArrayのタイプをInteger[]に変更することで簡単に修正できます。これは、int[]Integer[]に直接キャストできないため、既存の配列で作業している場合は単純ではありません(this questionを参照してください。のメソッドが特に好きです。Apache Commons Lang)。

+1

正しい、ofcですが、私がこのようなことを書くたびに、私はうんざりしています - そのような統語的なもつれです。 –

+0

完璧、ありがとう! – pad

+0

@ SteveB。私は同意します。オーバーロードは、この種のメソッド呼び出しを強制するよりはるかに良い選択です。 varargsは素晴らしいですが、コレクションではうまくいきません。 – Brian

3

構造IEntityModifier...IEntityModifier[]

ためのシンタックスシュガーはappropriate JLS section8.4.1仮パラメータ)を参照してくださいある

3

私はいつもIterable< ? extends IEntityModifier >を受け取るオーバーロードを作成し、これを楽しみに可変引数バージョンを作ります安価なArrays.asList()を使用してください。

+0

今私はそれを "一行"することができます! –

関連する問題