2012-09-21 11 views
16

Ich habe eine ArrayList mit Elementen gefüllt. Ich möchte die Elemente dieser Array-Liste als Argumente an eine Variadic-Funktion übergeben.Wie Elemente einer ArrayList zu Variadic-Funktion übergeben werden

Meine Funktion

public SequenceEntityModifier(final IEntityModifier... pEntityModifiers) 

Mein Arraylist

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

Ich möchte es an die Funktion übergeben, als ob ich sie einzeln passieren würde.

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

Ist so etwas möglich?

Vielen Dank im Voraus.

Antwort

21

Just do:

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

Dies kopiert die ArrayList an die angegebene Array und es zurückgibt. Alle Vararg Funktionen können auch Arrays für das Argument nehmen, also:

public void doSomething(Object... objs) 

Alle rechtlichen Anrufe sind:

doSomething(); // Empty array 
doSomething(obj1); // One element 
doSomething(obj1, obj2); // Two elements 
doSomething(new Object[] { obj1, obj2 }); // Two elements, but passed as array 

Eine Einschränkung:

Vararg nennt denen primitive Arrays don‘ t arbeiten, wie Sie es erwarten würden. Zum Beispiel:

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

Man könnte erwarten, dass diese 1, 2 und 3, auf separate Linien zu drucken. Stattdessen wird so etwas wie [[email protected] (das Standard toString Ergebnis für eine int[]) gedruckt. Dies liegt daran, es ist schließlich ein Object[] mit einem Element zu schaffen, die unsere int[] ist, z.B .:

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

Das Gleiche gilt für double[], char[] und andere primitive Array-Typen. Beachten Sie, dass dies einfach durch Ändern des Typs intArray zu Integer[] behoben werden kann. Dies ist möglicherweise nicht einfach, wenn Sie mit einem vorhandenen Array arbeiten, da Sie kein int[] direkt an ein Integer[] (siehe this question, ich bin besonders gern auf die ArrayUtils.toObject Methoden von Apache Commons Lang).

+1

Richtig, OFC, aber jedes Mal, wenn ich so etwas wie dies schreibe ich erschaudern - eine solche syntaktischen Gewirr. –

+0

perfekt, vielen dank! – pad

+0

@SteveB.Ich stimme zu, dass Überladen eine viel bessere Option ist, als einen solchen Methodenaufruf zu erzwingen und dann hinter die Kulissen zu konvertieren. Während Varargs nett sind, spielen sie nicht gut mit Sammlungen. – Brian

3

Das Konstrukt IEntityModifier... ist syntaktischer Zucker für IEntityModifier[]

die appropriate JLS section (8.4.1 Formalparameter) Siehe

3

ich eine Überlastung immer schaffen, die Iterable< ? extends IEntityModifier >, und stellen Sie die variadische Version uns auf diese nimmt man mit Arrays.asList(), die billig ist.

+0

jetzt kann ich "one line" es, thx! –

Verwandte Themen