2009-08-24 1 views
4

In section 15.12.2.5 of the Java Language Specification, spricht er darüber, wie die spezifischste Verfahren in beiden Fällen von Methoden mit festen arity und Methoden der variablen arity zu wählen (das heißt varargs).Die meisten spezifischen Verfahren mit Streichhölzern sowohl fix/variabel arity (varargs)

Was ich in der JLS nicht finden kann, ist etwas über die Entscheidung zwischen zwei Methoden, wobei eine feste und eine variable ist. Zum Beispiel:

public interface SomeApi { 
    public String getSomething(String arg);  // method 1 
    public String getSomething(String ... args); // method 2 
} 

Compiliert ganz gut wie man erwarten würde (für von Yoni genannten Gründen unter). Diese Berufung Code kompiliert auch:

SomeApi api = ... 
Object o = api.getSomething("Hello"); 

und wenn Sie es laufen, method #1 (das heißt die Nicht-varargs Methode) aufgerufen. Warum ist dieser Anrufcode nicht mehrdeutig? Warum ist die Fixed-Arity-Methode spezifischer als die Variable-Arity-Methode? Kann mich jemand auf das relevante Teil der Spezifikation hinweisen?

+1

nur neugierig ... haben Sie haben einen bestimmten Grund für das Verständnis neben einem akademischen Interesse? (Ich versuche, Laufzeit-Dispatch-Auswahl zu implementieren + fragte sich, wer sonst könnte das gleiche tun) –

Antwort

10

Die erste Phase Methode Auflösung nur feste arity Methoden hält und der Prozess wird beendet, wenn eine Übereinstimmung gefunden wird, bevor irgendwelche varargs Methoden in Betracht gezogen werden.

Von http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2

15.12.2.2 Phase 1: Identifizieren Passende Arity Methoden Anwendbar von Subtyping

Wenn keine Methode anwendbar Subtypisierung gefunden wird, geht die Suche nach anwendbaren Methoden mit Phase 2 (§15.12.2.3). Andernfalls wird die spezifische Methode (§15.12.2.5) unter den Methoden durch Subtyping ausgewählt.

(Hervorhebungen von mir.)

+0

Danke Alex - Ich sah den Wald nicht für die Bäume. Verdammt diese Bäume! –

+1

Diese Varargs sind verflucht! – pjp

-1

Ich kann Ihnen nicht die spec Punkt, aber logisch,

getSomething(String...args) 

übersetzt

getSomething(String[] args) 

ohne Zweideutigkeit

+0

Ja - das verstehe ich. Ich fragte, warum der Anrufcode nicht mehrdeutig ist - ich habe meine Absicht in der Frage geklärt –