2014-12-04 13 views
14

ho un po 'la funzione del sistema varargs, dove T è un certo tipo effettivo, come String:Come chiamare un metodo varargs con un ulteriore argomento da un metodo varargs

sys(T... args) 

Voglio creare una propria funzione, che delega alla funzione di sistema. La mia funzione è anche una funzione varargs. Voglio passare tutti gli argomenti per la mia funzione fino alla funzione di sistema, oltre a un argomento finale aggiuntivo. Qualcosa del genere:

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

Come è necessario modificare la linea con l'errore? Ora vedo solo un modo: creare array con dimensione [args] + 1 e copiare tutti gli elementi nel nuovo array. Ma forse esiste un modo più semplice?

+1

@aioobe, tipo di oggetto effettivo, in caso contrario, se ho ragione, non posso creare myObj. Alcuni cambiano il primo messaggio –

+0

Ecco perché lo stavo chiedendo ;-) – aioobe

risposta

7

Ora vedo solo un modo: creare array con dimensione [args] + 1 e copiare tutti gli elementi nel nuovo array.

Non esiste un modo più semplice. È necessario creare un nuovo array e includere myobj come ultimo elemento dell'array.

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

Se vi capita di dipendere da Apache Commons Lang si può fare

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

o Guava

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

si può chiamare sys() due volte se l'ordine non si preoccupa:

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

Se non puoi usare questo, passa alle collezioni (es. LinkedList) per tutte le tue funzioni.

+1

Non posso fare questa chiamata, perché restituisce un altro oggetto come risultato, dipendente dai parametri di input. Ad esempio: string.format(). –

+0

Quindi è necessario copiare la matrice o utilizzare le raccolte per tutte quelle funzioni. Quindi puoi aggiungere il tuo nuovo oggetto. – brummfondel

+0

@brummfondel, stai suggerendo che dovrebbe modificare la raccolta degli argomenti? Questo non è molto educato per il chiamante (e funziona solo se l'argomento è una collezione mutevole). – aioobe

2

Se è possibile utilizzare Guava, allora si può fare:

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

Java 8 soluzione:

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