2012-06-05 9 views
5

Ich bin auf der Suche nach einem relevanten Teil der Java Language Specification (JLS), die das Verhalten beim Aufruf einer Variable Varity (Vararg) -Methode beschreibt.Welcher Teil der Java Language Specification beschreibt das Verhalten von weggelassenen Varargs?

Betrachten Sie die Methode:

public static void printVarArgs(String... args) { 
    System.out.println(Arrays.toString(args)); 
} 

Wenn ich die Methode, wie so aufrufen:

printVarArgs(); 

Die Ausgabe aussehen wird: [] weil der Wegfall von args an der Aufrufstelle hat in umgewandelt worden ein leeres Array in der printVarArgs Methode.

Ich bin auf der Suche nach dem Punkt der JLS, die dieses Verhalten definiert. Der nächste, den ich gefunden habe, ist 15.12.4.2 Evaluate Arguments, aber es gibt dieses Beispiel nicht, und ich bin nicht sicher, ob dieser Fall tatsächlich von der formalen/mathematischen Beschreibung abgedeckt wird.

Welcher Teil der JLS beschreibt die automatische Erstellung eines leeren Arrays, wenn ein Vararg weggelassen wird?

Antwort

4

Der Text dieser JLS Abschnitt sagt:

Wird das Verfahren ein Verfahren variable arity aufgerufen wird (§8.4.1) m es notwendigerweise n > 0 formalen Parameter. Der letzte formale Parameter von m hat notwendigerweise den Typ T[] für einige T, und m wird notwendigerweise mit k >= 0 tatsächlichen Argumentausdrücken aufgerufen.

Wenn m mit kn tatsächlichem Argumente Ausdrücke aufgerufen wird, oder, wenn m mit k != n tatsächlichen Argumentausdrücke und die Art des k-ten Argument Ausdrucks aufgerufen wird, ist nicht Zuordnung kompatibel mit T[], dann der Argumentliste (e1, ... , en-1, en, ...ek) ausgewertet als wenn es als (e1, ..., en-1, new T[]{en, ..., ek}) geschrieben wäre.

Im Fall, dass Sie zu sprechen, gibt es k == n - 1 formale Argumente, so en, ..., ek eine leere Sequenz, und das bedeutet, das Argument ausgewertet wird, als ob es (e1, ..., en-1, new T[]{}) war.

Mit anderen Worten, das Verhalten wird in dem Abschnitt angegeben, den Sie betrachteten.

5

Von JLS 15.12.4.2:

Der letzte formale Parameter von m hat notwendigerweise T [] für ein T-Typ, und m notwendigerweise mit k> = 0 eigentliche Argument Ausdrücke aufgerufen wird.

Das ist aus der aufgerufenen Perspektive. Ich bin nicht sicher, wo es aus der Perspektive des Anrufers das Verhalten, das Sie angeben, angibt, aber es ist irgendwie impliziert.

+0

Hallo, danke für deine Antwort. Ich habe +1 gegeben, aber ich habe die andere Antwort akzeptiert, da ich sie etwas erklärender finde. – Grundlefleck