2016-03-23 11 views
10

Die folgende Code druckt "String"Warum und wie kompiliert sich dieser Java-Code?

public class Riddle { 

    public static void main(String[] args) { 
     hello(null); 
    } 

    public static void hello(Object o) { 
     System.out.println("Object"); 
    } 


    public static void hello(String s) { 
     System.out.println("String"); 
    } 

} 

Warum dieser Code kompilieren? Ist nicht Null mehrdeutig?

Zum Beispiel wird der folgende Code nicht kompiliert wegen einer mehrdeutigen Signatur.

Kann jemand bitte erklären, warum das erste Beispiel kompilieren kann, ohne mehrdeutige Fehler zu haben?

+3

Die Null ist nur ein Parameter. Im zweiten Fall kann die Methodensignatur "Objekt" nicht gegen die anderen beiden aufgelöst werden. –

+2

Herzlichen Glückwunsch, ich glaube, Sie haben eines der wirklichen Löcher in Javas Typentheorie gefunden. Im Allgemeinen ist "Null" eine seltsame Kreatur zum Eintippen von Systemen. Wenn Sie daran interessiert sind, können Sie den Optionstyp, den einige Sprachen verwenden, ausprobieren ... Ich persönlich finde, dass es ein wirklich gutes Feature ist und ich wünschte, es wäre nicht zu spät, es in Java zu bringen. –

+5

Siehe auch http://stackoverflow.com/questions/2608394/how-isambiguity-in-selecting-from-overloaded-methods-resolved-in-java oder auch http://stackoverflow.com/questions/1545501/ which-overload-wird-für-null-in-java ausgewählt – Philipp

Antwort

0

bitte, sieht JLS §15.12.2

der Methode folgende Reihenfolge Zweck für den Aufruf der Lösung ist wichtig, wenn gleicher Typ Datentyp es

ist ein exakten Daten
  1. (für primitiven Datentyp) -Typ übereinstimmen und dann anrufen. 1.1 Wenn nicht, dann rufen Sie zu breiter dann diesen Datentyp verfügbar dann rufen Sie es an.
  2. Übereinstimmung für Wrapper-Typ des Datentyps oder Elternteil davon, wenn darüber dann fehlgeschlagen.
  3. Vararg dieses Datentyps wird übereinstimmen, wenn über 2 fehlgeschlagen ist.
Verwandte Themen