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).
Richtig, OFC, aber jedes Mal, wenn ich so etwas wie dies schreibe ich erschaudern - eine solche syntaktischen Gewirr. –
perfekt, vielen dank! – pad
@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