Beim Überladen des Konzepts habe ich einen Zweifel. Wenn ich die Methode mit int-Wert überladen will, ist der Methodenaufruf die Float-Parameter-Methode und nicht die Double-Parameter-Methode.
%Vor%%Vor%Methodenaufruf:
Ausgabe: float
Wie in den Java-Tutorials in diesem Link angegeben Ein Fließkomma-Literal hat den Typ float, wenn es mit dem Buchstaben F oder f endet; ansonsten ist sein Typ doppelt und kann optional mit dem Buchstaben D oder d enden.
Im obigen Fall sollte der Methodenaufruf die Doppelparametermethode aufrufen. Aber es ruft die float-Parametermethode auf.
Wie findet die Überlastung in diesem Bereich statt?
Das Testen einer Variante Ihres Codes, außer mit byte
literal und überladenen Methoden mit verschiedenen Kombinationen von short
, int
und long
scheint zu implizieren, dass der Compiler die "am wenigsten verbreiternde" Konvertierung wählt mehr als eins ist verfügbar.
Also:
short
und einem int
, wenn Sie die überladene Methode mit einem byte
aufrufen, wird die short
Variante gewählt int
und einem long
, wenn Sie die überladene Methode mit einem byte
oder short
aufrufen, wird die int
Variante gewählt Und so weiter.
Daher kann long
entweder auf float
oder double
erweitert werden, und da die float
Umwandlung die "geringste Erweiterung" ist, wird die float
Überladung gewählt.
Ich denke dies ist wegen der "Wählen Sie die spezifischste Überladung" Weg, dass der Compiler mehrere mögliche Überlastungen auflöst. Aus der JLS, Abschnitt 15.12.2.5:
Die informelle Intuition ist, dass eine Methode spezifischer ist als eine andere, wenn ein Aufruf, der von der ersten Methode behandelt wird, ohne einen Kompilierungsfehler an die andere weitergegeben werden kann.
Somit ist eine Methode, die ein float
verwendet, "spezifischer" als eine Methode, die ein double
verwendet, weil jeder Aufruf, der von einer Methode bearbeitet wird, die ein float
akzeptiert, immer von einer Methode gehandhabt werden kann Nimmt double
, aber nicht umgekehrt.
nach Ссылка
5.1.2. Verbreiterung der primitiven Konvertierung
19 spezifische Konvertierungen von primitiven Typen werden als Erweiterung bezeichnet Grundlegende Konvertierungen:
Byte zu kurz, int, long, float oder double
kurz zu int, long, float oder double
char zu int, long, float oder double
int zu lang, float oder double
lang, um zu floaten oder zu verdoppeln
float um zu verdoppeln
In Java gibt es eine Beziehung zwischen der Unterklasse und der Oberklasse und auch die aufsteigende Ebene für Grundelemente von Byte short .... bis double.
Die Regel lautet: Wann immer es eine Mehrdeutigkeit gibt, welche überladene Methode zu wählen ist, wird die nächstliegende überladene Methode der Unterklasse oder die nächstliegende Primitive in aufsteigender Reihenfolge gewählt.
Tags und Links java oop method-overloading overloading