2011-09-10 16 views
10

Ho un metodo simile:Tipo di ritorno vararg?

void foo(int x, Grok... groks); 

Non c'è modo di definire un metodo che restituisce un tipo di varargs, giusto? Idealmente voglio un ulteriore metodo di utilizzo:

foo(25, new Grok(), new Grok(), generateMoreGroks()); 

public Grok... generateMoreGroks() { 
    return new Grok[] { 
     new Grok(), new Grok(), new Grok() }; 
} 

giusto?

---- Maggiori informazioni --------------

Il problema con quanto sopra è che non siamo in grado di mescolare alcuni casi Grok stanziati lì con una serie di Groks:

"new Grok(), new Grok(), generateMoreGroks());" 

e non credo che sia legale, a meno che non si può definire un metodo per restituire un tipo di vararg (credo).

Grazie

risposta

8

Si può fare,

Grok[] generateMoreGroks() { 

Se un metodo prende un parametro varargs, è lo stesso che un array.

Ora è necessario sovraccaricare foo per permettergli di prendere alcuni casi Grok, e il resto come varargs,

foo(int x, Grok... rest) 
foo(int x, Grok g1, Grok... rest) 
foo(int x, Grok g1, Grok g2, Grok... rest) 
foo(int x, Grok g1, Grok g2, Grok g3, Grok... rest) 

Dove metodi foo sono come,

foo(int x, Grok g1, Grok... rest) { 
    Grok[] groks = new Grok[rest.length + 1]; 
    groks[0] = g1; 
    System.arrayCopy(rest, 0, groks, 1, rest.length); 
    foo(x, groks); 
} 

Questo è un po 'brutto .

+2

Hi sì, ma non riesco a mescolare un array con alcuni casi Grok nel parametro varargs (come nella chiamata a foo() di cui sopra). Posso solo fornire un array, o singole istanze di Grok. Ma non entrambi? – user291701

+0

@ user291701 - È corretto. –

+0

modificato per mostrare come farlo, diventa brutto però – sbridges

4

No, non c'è ... ma cambia la firma della funzione e funzionerà bene.

public Grok[] generateMoreGroks() { 
    return new Grok[] { 
     new Grok(), new Grok(), new Grok() }; 
} 
+0

Giusto, ma non riesco a mescolare alcune 'nuove istanze di Grok()' con l'array restituito da generateMoreGroks() nella chiamata a foo(). – user291701