2013-02-09 14 views
13

Ho il seguente frammento di codice:Strano comportamento Java nullo in overloading dei metodi

public static void foo(Object x) { 
    System.out.println("Obj"); 
} 
public static void foo(String x) { 
    System.out.println("Str"); 
} 

Se chiamo foo(null) perché non c'è alcuna ambiguità? Perché il programma chiama foo(String x) anziché foo(Object x)?

+2

I sovraccarichi non vengono risolti staticamente utilizzando il tipo di espressione in fase di compilazione? –

+0

'foo (null)' chiama il metodo della classe superiore –

+1

@GrijeshChauhan Che classe superiore. La domanda non menziona una gerarchia di classi. – millimoose

risposta

20

perché il programma chiede foo(String x) anziché foo(Object x)

Questo perché String classe estende da Object e quindi è più specifico Object. Quindi, il compilatore decide di invocare quel metodo. Ricorda, il compilatore sceglie sempre il metodo più specifico da invocare. Vedere Section 15.12.5 of JLS

Se più di un metodo membro è accessibile e applicabile ad una chiamata di metodo , è necessario scegliere uno di fornire il descrittore per il metodo di spedizione in fase di esecuzione. La lingua Java programmazione utilizza la regola che il metodo più specifico è scelto.

L'intuizione informale è che un metodo è più specifico di altro eventuale invocazione gestita dal primo metodo potrebbe essere passato sulla all'altro senza un errore in fase di compilazione.

Tuttavia, se si dispone di due metodi con parametri - String e Integer, poi si otterrebbe ambiguity di errore per null, come compilatore non può decidere quale è più specifica, in quanto sono i tipi non covarianti.

+0

+1, ma potrebbe usare un JLS cite – millimoose

+0

È 15.12.2 - vedi anche questa domanda http://stackoverflow.com/questions/5229809/method-overloading-for-null-parameter –

+0

come posso chiamare il metodo meno specifico ?? –

2

Quando viene data una scelta tra due metodi in cui l'argomento è valido per entrambi i parametri, il compilatore sceglierà sempre il parametro più specifico come corrispondenza. In questo caso, null è un valore letterale che può essere gestito come Object e uno String. String è più specifico e una sottoclasse di Object, quindi il compilatore lo utilizza.

+0

Grazie per la risposta – dreamcrash

5

Si chiama il metodo most specific.

Poiché String è una sottoclasse di Object, String è "più specifico" di Object.

5
  1. Il tipo di null è per definizione un sottotipo di ogni altro tipo di riferimento. Citazione JLS 4.1:

    Il riferimento null può sempre subire una conversione di riferimento di ampliamento a qualsiasi tipo di riferimento.

  2. La risoluzione della firma del metodo coinvolti in un'invocazione segue il principio della firma più specifica nel set di tutte le firme compatibili. (JLS 15.12.2.5 Scelta del metodo più specifico).

Prendendo insieme questo significa che il sovraccarico di String è stato scelto nell'esempio.

Problemi correlati