2015-08-11 21 views
6

Ho trovato questo codice Java da this site. Non capisco come si compila senza errori ambigui.Perché è possibile passare null a un metodo Java sovraccarico?

package swain.test; 

public class Test { 
    public static void JavaTest(Object obj) { 
     System.out.println("Object"); 
    } 

    public static void JavaTest(String arg) { 
     System.out.println("String"); 
    } 

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

uscita:

String 
+1

Cosa c'è di sbagliato con questo codice sopra? –

+1

perché non dovrebbe essere compilato? la tua risposta non ha nemmeno chiesto perché è String e non Object che è stato stampato sullo schermo, quindi ho pensato che stavi solo parlando di compilation. non c'è alcun problema – 12dollar

+0

Probabilmente perché 'String' IS-A' Object'. – kajacx

risposta

6

null possono essere passati sia JavaTest(String arg) e JavaTest(Object obj), quindi il compilatore sceglie il metodo con i tipi degli argomenti più specifici. Poiché String è più specifico di Object (String è una sottoclasse di Object), viene selezionato JavaTest(String arg).

Se invece di JavaTest(Object obj) avevi JavaTest(Integer obj), la compilazione sarebbe fallito, dal momento che Integer non è più specifico rispetto String e String is not more specific than Integer`, in modo che il compilatore non sarebbe in grado di fare una scelta.

+1

Ma "Integer" ammette anche "Null" anche se poi fallirà? –

+1

@SubodhJoshi Sì, il numero intero consente null, quindi il compilatore non sarebbe in grado di scegliere tra 'JavaTest (String arg)' e 'JavaTest (Integer obj)'. – Eran

+0

Scusa, ma non sono in grado di capire quale sia il problema tra cui scegliere 'JavaTest (String arg)' e 'JavaTest (Integer obj)'. Quando il compilatore può scegliere tra 'JavaTest (String arg)' e 'JavaTest (Object obj) 'Sappiamo che' Object' può essere 'Null',' String' può essere 'Null' e' Integer' può essere 'Null'? –

Problemi correlati