2015-11-01 23 views
11

Ich weiß, dass die Java-Arrayargumentsyntax "..." als Parameter ein Array empfangen kann oder nur viele Parameter, die an die Methode übergeben werden. Ich bemerkte jedoch, dass es zwar für Sammlungen zu:Java automatisch konvertiert Sammlungen in Argumente Arrays?

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"); 
} 

Dies kompiliert und läuft ohne mich die toArray() Methode, um anzurufen. Was passiert hinter der Szene? Gibt es für diese Syntax zusätzliche Methoden dieser "Auto-Konvertierung"?

BTW, ich benutze Java 1.7.

Antwort

12

Die Sammlung wird nicht in ein Array konvertiert. Er übergibt die Sammlung selbst als erstes Vararg-Argument. Die Testmethode erhält somit ein Array von einem Element, und dieses Element ist die ArrayList.

Dies kann durch leicht ersetzen

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

von

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

oder unter Verwendung eines Debuggers gefunden.

4

A Collection<Object> ist auch ein Object so, wenn Sie test mit

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

aufrufen wird es mit einem einzelnen Parameter aufgerufen werden, die Ihre Sammlung ist: das Verfahren wird ein Array mit einem einzelnen Element erhalten.

4

Was passiert hier ist, dass die Methode ein Array der Länge 1 mit einem einzigen Collection erhält.

Die meiste Zeit, die Unterschrift

method(Object... objs) 

sollte vermieden werden, da es akzeptieren jede Folge von Parametern, auch Primitiven, da diese automatisch verpackt bekommen.

+0

Danke. Dachte nicht so ... – Ozilophile

Verwandte Themen