2013-02-23 11 views
8

Ho riscontrato un problema nel mio programma e l'ho reso chiaro con un piccolo frammento di codice di seguito. Qualcuno può spiegare perché questo sta accadendo?Passaggio null al metodo che preferisce String, non Object

class ObjectnullTest { 

    public void printToOut(String string) { 

     System.out.println("I am null string"); 
    } 


    public void printToOut(Object object) 

     System.out.println("I am null object"); 
    } 



class Test { 

    public static void main(String args[]) { 

     ObjectnullTest a = new ObjectnullTest(); 
     a.printToOut(null); 

    } 
} 

Questo stampa sempre I am null string.

Voglio sapere il motivo in modo che possa modificare il codice.

Grazie in anticipo.

+1

possibile duplicato del [overloading dei metodi per il parametro NULL] (http://stackoverflow.com/questions/5229809/method-overloading-for-null-parameter) – jlordo

+0

Molti altri, vedi [http://stackoverflow.com/search?q=%5Bjava%5D+overloading+null](http://stackoverfl ow.com/search?q=%5Bjava%5D+overloading+null) – jlordo

+0

Ci scusiamo per la stessa domanda di criterio, che non è possibile trovare con i termini chiave corretti. –

risposta

11

E 'perché in caso di sovraccarico metodo

Il metodo più specifico viene scelto al momento della compilazione. 'java.lang.String'

Come è più tipo specifico di 'java.lang.Object'. Nel tuo caso viene scelto il metodo che accetta 'String' come parametro.

sua chiaramente documentati in JLS:

Il secondo passo ricerche del tipo definito nel passaggio precedente per metodi membri. Questo passaggio utilizza il nome del metodo e i tipi di espressioni di argomento per individuare metodi accessibili sia sia applicabili, ovvero dichiarazioni che possono essere correttamente richiamate sugli argomenti specificati.

Ci può essere più di un metodo di questo tipo, in in questo caso viene scelto quello più specifico. Il descrittore (firma più tipo di ritorno) del metodo più specifico è quello utilizzato in fase di esecuzione per eseguire l'invio del metodo.

5

Sono d'accordo con il commento esistente sulla selezione del metodo più specifico. È possibile forzare la tua null per essere trattato come un oggetto di riferimento, eliminando l'uso del metodo di argomento String, gettandola:

a.printToOut((Object)null); 
2

si prega di consultare la sezione 15.12.2.5 di JLS che danno in dettaglio come scegliere

Il metodo più specifica viene scelto al momento della compilazione

Problemi correlati