2016-05-03 10 views
1

während ich durch Autoboxing und Unboxing in Java ging, lernte ich, dass Java primitive Datentypen in Wrapper-Klasse und umgekehrt konvertiert, wann immer es nötig ist. z.B. Wenn die Funktion Integer als Parameter verwendet, wenn wir den Wert 1 übergeben, konvertiert der Java-Compiler sie in new Integer(1). jetzt unten ist mein Fall.Warum unterstützt Java das Überladen von Funktionen für primitive Datentypen?

public class JavaTest 
{ 

    public static void Test(Integer integer) 
    { 
     System.out.println("in Integer"); 
    } 

    public static void Test(int integer) 
    { 
     System.out.println("in int"); 
    } 

    public static void main(String[] args) 
    { 
     Test(1); 
    } 
} 

In diesem Fall sollte Java Kompilierungszeit Ausnahme ausgelöst haben. aber es erfolgreich kompiliert und Druck unterhalb Ergebnis

in int

wenn ich entfernt den Test (int integer) Methode dann java gibt führe ich

in integer

meine Frage ist, warum Java solche Funktion Überladung erlaubt?

+2

nicht seine nicht duplizieren – Abhijit

+1

ja, es irgendwie ist. Sie müssen zuerst den Unterschied zwischen Klassen- und Primitivtypen verstehen. – Vucko

+0

Ich denke, es ist ähnlich, aber kein Duplikat - schauen Sie sich den Kontext hier an. – Mena

Antwort

3

Java ermöglicht eine solche Überladung für Abwärtskompatibilität.

Da das automatische Boxing und automatische Unboxing in Java 5.0 eingeführt wurde, versucht die erste Stufe der Methodenüberladungsauflösung, eine passende Methode zu finden, ohne Auto-Boxing und Auto-Unboxing zu verwenden.

Daher wird in Ihrem Beispiel nur die Methode gefunden, die ein int Argument verwendet. Wenn Sie diese Methode entfernen, wird in der ersten Phase der Methodenüberladungsauflösung keine Übereinstimmung gefunden, und die zweite Stufe verwendet automatisches Boxing, um der Methode zu entsprechen, die ein Integer-Argument verwendet.

15.12.2. Compile-Time Step 2: Determine Method Signature

Der Rest des Prozesses ist in drei Phasen unterteilt, Kompatibilität mit Versionen der Programmiersprache Java vor der Java SE 5.0 zu gewährleisten. Die Phasen sind:

  1. die erste Phase (§15.12.2.2) führt Überladungsauflösung ohne ermöglicht Boxen oder unboxing Umwandlung oder die Verwendung von variablen arity Methodenaufruf. Wenn während dieser Phase keine geeignete Methode gefunden wird, wird die Verarbeitung in der zweiten Phase fortgesetzt.

    Dies gewährleistet, dass alle Anrufe, die 5,0 in der Programmiersprache Java vor Java SE gültig waren, sind nicht mehrdeutig betrachtet als das Ergebnis der die Einführung variabler arity Methoden, implizite Boxen und/oder Unboxing. Die Deklaration einer Variablenaritätsmethode (§8.4.1) kann jedoch die für einen bestimmten Methodenmethodenaufrufausdruck gewählte Methode ändern, da eine variable Aritätsmethode in der ersten Phase als feste Methode behandelt wird. Wenn beispielsweise m (Object ...) in einer Klasse deklariert wird, die bereits m (Object) deklariert, wird m (Object) für einige Aufrufausdrücke (wie m (null)) nicht mehr als m (Object []) ist spezifischer.

  2. die zweite Phase (§15.12.2.3) führt, während der Überladungsauflösung ermöglichen Boxen und unboxing, aber schließt weiterhin die Verwendung von variablen arity Methodenaufruf.Wenn während dieser Phase keine geeignete Methode gefunden wird, wird die Verarbeitung in der dritten Phase fortgesetzt.

    Dies stellt sicher, dass eine Methode niemals über den Aufruf der Variablenaritätsmethode ausgewählt wird, wenn sie über den Aufruf der Methode mit fester Arithmetik anwendbar ist.

  3. Die dritte Phase (§15.12.2.4) erlaubt das Überladen mit variablen Arity-Methoden, Boxing und Unboxing zu kombinieren.

+2

Es wird davon abgeraten, doppelte Fragen zu beantworten, wie in den FAQ http://meta.stackexchange.com/questions/10841/how-should- Duplikat-Fragen-behandelt werden. Man sollte nach passenden Duplikaten suchen und stattdessen abstimmen. – Tunaki

Verwandte Themen