2014-12-04 21 views
14

mam pewne funkcje systemu varargs, gdzie T jest jakiś rzeczywisty typ, jak String:Jak wywołać metodę varargs z dodatkowym argumentem z metody varargs

sys(T... args) 

Chcę stworzyć własną funkcję, która deleguje do funkcji systemu. Moja funkcja to również funkcja varargs. Chcę przejść przez wszystkie argumenty dotyczące mojej funkcji do funkcji systemowej plus dodatkowy argument końcowy. Coś takiego:

myfunc(T... args) { 
    T myobj = new T(); 
    sys(args, myobj); // <- of course, here error. 
} 

Jak muszę zmienić wiersz z błędem? Teraz widzę tylko jeden sposób: utwórz tablicę z wymiarem [args] + 1 i skopiuj wszystkie elementy do nowej tablicy. Ale może istnieje prostszy sposób?

+1

@aioobe, rzeczywisty typ obiektu, w przeciwnym razie, jeśli mam rację, nie mogę tworzyć myobj. Niektóre zmieniają pierwszą wiadomość –

+0

Dlatego właśnie pytałem ;-) – aioobe

Odpowiedz

7

Teraz widzę tylko jeden sposób: utwórz tablicę z wymiarem [args] + 1 i skopiuj wszystkie elementy do nowej tablicy.

Nie ma prostszego sposobu. Musisz utworzyć nową tablicę i dodać myobj jako ostatni element tablicy.

String[] args2 = Arrays.copyOf(args, args.length + 1); 
args2[args2.length-1] = myobj; 
sys(args2); 

Jeśli zdarzy się, zależy od Apache Commons Lang można zrobić

sys(ArrayUtils.add(args, myobj)); 

lub Guava

sys(ObjectArrays.concat(args, myobj)); 
6

Możesz zadzwonić sys() dwukrotnie jeśli zamówienie nie obchodzi:

T myobj=new T(); 
sys(myobj); 
sys(args); 

Jeśli nie możesz tego użyć, przełącz się na kolekcje (np. LinkedList) dla wszystkich twoich funkcji.

+1

Nie mogę wykonać tego wywołania, ponieważ sys z powrotem do innego obiektu w wyniku, zależy od parametrów wejściowych. Na przykład: string.format(). –

+0

Następnie należy skopiować tablicę lub użyć kolekcji dla wszystkich tych funkcji. Następnie możesz dodać swój nowy przedmiot. – brummfondel

+0

@brummfondel, sugerujesz, że powinien zmodyfikować zbiór argumentów? To nie jest zbyt uprzejme dla dzwoniącego (i działa tylko wtedy, gdy argument jest zmienną kolekcją). – aioobe

2

Jeśli można użyć Guava, to można zrobić:

sys(ObjectArrays.concat(myobj, args)) 
1

Java 8 rozwiązanie:

sys(Stream.concat(Arrays.stream(args), Stream.of(myobj)).toArray(T[]::new));