2016-03-23 18 views
10

Il codice seguente stampa "String"Perché e come viene compilato questo codice Java?

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

} 

Perché quel codice compilare? Non è nullo ambiguo?

Ad esempio, il seguente codice NON verrà compilato a causa di una firma ambigua.

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

} 

Qualcuno può spiegare perché il primo esempio può essere compilato senza errori ambigui?

+3

Il valore "null" è solo un parametro. Nel secondo caso, la firma del metodo 'Object' non può essere risolta con gli altri due. –

+2

Congratulazioni, penso che tu abbia trovato uno dei veri buchi nella teoria dei tipi di Java. In generale, "Null" è una specie di strana creatura per digitare i sistemi. Se sei interessato a questo, potresti controllare il tipo di opzione che alcune lingue usano ... Personalmente ritengo che sia una funzionalità davvero buona e vorrei che non fosse troppo tardi per portarlo in Java. –

+5

Vedere anche http://stackoverflow.com/questions/2608394/how-is-ambiguity-in-selecting-from-overloaded-methods-resolved-in-java o anche http://stackoverflow.com/questions/1545501/ che-sovraccarico si-get-selezionata-per-nullo-in-java – Philipp

risposta

0

per favore, vedi JLS §15.12.2

seguente ordine del metodo di risolvere per chiamare scopo è importante quando stesso tipo di dati-tipo è lì,

  1. (per primitivo tipo di dato) dati esatti -tipo match quindi chiamalo. 1.1 se non lo è, chiama a questo indirizzo, quindi chiama questo.
  2. corrisponde a Tipo di wrapper di Tipo dati o padre di esso se in seguito non è riuscito.
  3. Vararg di questo tipo di dati corrisponde se sopra 2 non è riuscito.
Problemi correlati