Wystarczy zrobić:
new SequenceEntityModifier(arr.toArray(new IEntityModifier[arr.size()]));
Kopiuje ArrayList
do podanej tablicy i zwraca go. Wszystkie funkcje vararg mogą również tablice do argumentu, więc dla:
public void doSomething(Object... objs)
Wszystkie rozmowy prawne:
doSomething(); // Empty array
doSomething(obj1); // One element
doSomething(obj1, obj2); // Two elements
doSomething(new Object[] { obj1, obj2 }); // Two elements, but passed as array
Jedno zastrzeżenie:
Vararg wzywa udziałem prymitywne tablice don” t działa tak, jak można się spodziewać. Na przykład:
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);
}
Można by oczekiwać tego, aby wydrukować 1
, 2
i 3
, na oddzielnych liniach. Zamiast tego wypisze coś w rodzaju [[email protected]
(domyślny wynik: toString
dla int[]
). To dlatego, że to ostatecznie tworząc Object[]
z jednego elementu, który jest naszym int[]
, np .:
// Basically what the code above was doing
Object[] objs = new Object[] { intArray };
samo dotyczy double[]
, char[]
i innych prymitywnych typów tablicowych. Zauważ, że można to naprawić po prostu zmieniając typ intArray
na Integer[]
. To może nie być proste, jeśli pracujesz z istniejącą tablicą, ponieważ nie możesz rzucić bezpośrednio int[]
bezpośrednio do Integer[]
(patrz this question, szczególnie lubię metody ArrayUtils.toObject
od Apache Commons Lang).
Prawidłowo, ofc, ale za każdym razem, gdy piszę coś takiego, wzdrygam się - taka syntaktyczna plątanina. –
idealne, wielkie dzięki! – pad
@SteveB.Zgadzam się, przeciążanie jest znacznie lepszą opcją niż wymuszenie tego rodzaju wywołania metody, a następnie konwersję za kulisami. Podczas gdy varargs są ładne, nie grają dobrze z kolekcjami. – Brian