2015-11-01 5 views
11

So che la sintassi dell'argomento dell'array Java "..." può ricevere come parametro un array, o solo molti parametri passati al metodo. Tuttavia, ho notato che lo fa per Collezioni troppo:Java converte automaticamente collezioni in array di argomenti?

public static void main(String[] args) { 
    Collection<Object> objects = new ArrayList<>(); 
    test(objects); 
} 

public static void test (Object...objects) { 
    System.out.println("no compile errors"); 
} 

Questo compilato ed eseguito senza di me la necessità di chiamare il metodo toArray(). Cosa sta succedendo dietro la scena? Esistono altri metodi per questa "conversione automatica" per questa sintassi?

BTW, sto usando Java 1.7.

risposta

12

Non converte la raccolta in un array. Passa la raccolta stessa come il primo argomento di vararg. Il metodo di test riceve quindi una matrice di un elemento e questo elemento è ArrayList.

Questo può essere trovato facilmente sostituendo

System.out.println("no compile errors"); 

da

System.out.println(Arrays.toString(objects); 

o utilizzando un debugger.

4

Un Collection<Object> è anche un Object in modo che quando si richiama test con

Collection<Object> objects = new ArrayList<>(); 
test(objects); 

sarà invocato con un unico parametro che è la vostra collezione: il metodo riceverà una matrice che ha un unico elemento.

4

Quello che sta accadendo qui è che il metodo riceve un array di lunghezza 1 contenente un singolo Collection.

maggior parte del tempo, la firma

method(Object... objs) 

dovrebbe essere evitato, come la volontà di accettare qualsiasi sequenza di parametri, anche primitive in quanto questi recuperi automatici in scatola.

+0

Grazie. Non ci ho pensato in questo modo ... – Ozilophile