2012-09-21 19 views
16

Mam listę elementów wypełnioną elementami. Chciałbym przekazać elementy tej listy tablicowej jako argumenty do funkcji variadic.Jak przekazywać elementy tablicy array do funkcji variadic

Moja funkcja

public SequenceEntityModifier(final IEntityModifier... pEntityModifiers) 

Moje ArrayList

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

Chciałbym przekazać go do funkcji jakby Chciałbym przekazać je indywidualnie.

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

Czy coś takiego jest możliwe?

Z góry dziękuję.

Odpowiedz

21

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).

+1

Prawidłowo, ofc, ale za każdym razem, gdy piszę coś takiego, wzdrygam się - taka syntaktyczna plątanina. –

+0

idealne, wielkie dzięki! – pad

+0

@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

3

Konstrukt IEntityModifier... jest cukier syntaktyczny dla IEntityModifier[]

Zobacz appropriate JLS section (8.4.1 parametrów formalnych)

3

zawsze tworzą przeciążenie, że trwa Iterable< ? extends IEntityModifier >, i sprawiają, że wersja o zmiennej liczbie argumentów naprzód do tego przy użyciu Arrays.asList(), który jest tani.

+0

teraz mogę "jeden wiersz" to, thx! –

Powiązane problemy