Was passiert, wenn wir int-Argumente an die Überlademethode übergeben, die float als Parameter für eine Methode und eine andere mit double param hat

7

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%
  

Methodenaufruf:

%Vor%
  

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?

    
Hariprasath 18.06.2014, 07:40
quelle

3 Antworten

13

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:

  • Zwischen einem short und einem int , wenn Sie die überladene Methode mit einem byte aufrufen, wird die short Variante gewählt
  • Zwischen einem 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.

    
awksp 18.06.2014, 18:12
quelle
7

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

    
Scary Wombat 18.06.2014 07:46
quelle
0

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.

    
Sachin Rane 05.02.2018 19:14
quelle