Die spezifische Methode mit Übereinstimmungen sowohl der festen/variablen Arität (Varargs)

StackOverflow https://stackoverflow.com/questions/1321657

  •  19-09-2019
  •  | 
  •  

Frage

Im Abschnitt 15.12.2.5 der Java -Sprachspezifikation, Es geht darum, wie in beiden Fällen von Methoden mit fester Arität und Methoden der variablen Arität die spezifischste Methode auswählt (dh varargs).

Was ich in der JLS nicht finden kann Einer ist von fester Arität und einer variablen Arität jedoch. Zum Beispiel:

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

Kompiliert gut, wie man es erwarten würde (Aus Gründen, die Yoni unten beschrieben haben). Dieser aufrufende Code kompiliert auch:

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

Und wenn Sie es ausführen, method #1 (dh die Nicht-Varargs-Methode) wird aufgerufen. Warum ist dieser Anrufcode nicht mehrdeutig? Warum ist die feste Arity-Methode spezifischer als die variable Arten? Kann mich jemand auf das relevante Teil der Spezifikation verweisen?

War es hilfreich?

Lösung

Die erste Phase der Methodeauflösung berücksichtigt nur feste Arity -Methoden, und der Prozess wird beendet, wenn eine Übereinstimmung gefunden wird, bevor Varargs -Methoden berücksichtigt werden.

Aus http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2

15.12.2.2 Phase 1: Identifizieren Sie Passende Arität Methoden, die durch Subtyping anwendbar sind

Wenn keine durch Subtyping anwendbare Methode gefunden wird, wird die Suche nach geltenden Methoden mit Phase 2 fortgesetzt (§15.12.2.3). Ansonsten wird die spezifischste Methode (§15.12.2.5) zwischen den Methoden ausgewählt, die durch Subtyping anwendbar sind.

(Mein Schwerpunkt.)

Andere Tipps

Ich kann Sie nicht auf die Spezifikation verweisen, aber logisch,

getSomething(String...args) 

wird übersetzt in

getSomething(String[] args)

ohne Mehrdeutigkeit

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top