2016-03-23 15 views
10

Poniższe drukuje kod "String"Dlaczego i jak ten kod Java się kompiluje?

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"); 
    } 

} 

Dlaczego ten kod skompilować? Czy nie jest niejednoznaczne?

Na przykład poniższy kod NIE zostanie skompilowany z powodu niejednoznacznego podpisu.

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(Integer o) { 
     System.out.println("Integer"); 
    } 

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

} 

Czy ktoś może wyjaśnić, dlaczego pierwszy przykład może się skompilować, nie powodując niejednoznacznych błędów?

+3

Opcja 'null' jest tylko parametr. W drugim przypadku podpis metody "Object" nie może zostać rozwiązany względem dwóch pozostałych. –

+2

Gratulacje, myślę, że znalazłeś jeden z faktycznych dziur w Teorii Typu Javy. Ogólnie rzecz biorąc, "Null" jest rodzajem dziwacznego stworzenia do systemów. Jeśli jesteś tym zainteresowany, możesz sprawdzić typ opcji używany w niektórych językach. Osobiście uważam, że jest to naprawdę dobra funkcja i chciałbym, żeby nie było za późno, aby wprowadzić ją do Javy. –

+5

Zobacz także http://stackoverflow.com/questions/2608394/how-is-ambiguity-in-selecting-from-overloaded-methods-resolved-in-java lub też http://stackoverflow.com/questions/1545501/ which-overload-will-get-selected-for-null-in-java – Philipp

Odpowiedz

0

proszę zobaczyć JLS §15.12.2

następującej kolejności metody rozdzielającym za nazwanie cel jest ważny gdy same dane typu typ jest tam,

  1. (dla danych typu prymitywnego) Dokładne dane -type match to zadzwoń. 1.1 Jeśli nie, zadzwoń do szerszego, a następnie wybierz ten typ danych, a następnie zadzwoń.
  2. dopasowanie do typu opakowania typu danych lub jego rodzica, jeśli powyższe nie powiodło się.
  3. Vararg tego typu danych zostanie dopasowany, jeśli powyżej 2-nie powiodło się.
Powiązane problemy