2009-11-26 9 views

risposta

49

Metodo sovraccarico viene risolto al momento della compilazione.

L'invio multiplo viene risolto in fase di esecuzione.

Quando si utilizza il doppio invio, il metodo chiamato dipende dal tipo effettivo di ricevitore e argomenti. Tuttavia, l'overloading del metodo consente solo al metodo chiamato di dipendere dal tipo dichiarato dei parametri. Perché? Java associa le chiamate di metodo in fase di compilazione con la propria firma completa (associazione anticipata). La firma completa include tutti i tipi di parametri, quindi quando il tipo effettivo di un argomento differisce in fase di esecuzione (polymoprhism), l'overloading non funziona come ci si potrebbe aspettare!

void add(Foo o) { ... } 
void add(Bar o) { ... } 
void client() { 
    Foo o = new Bar(); 
    add(o); // calls add(Foo) not add(Bar)! 
} 

utilizzando la spedizione multipla tuttavia

void add(Foo o) { o.dispatch(this); } 
void add(Bar o) { o.dispatch(this); } 
void client() { 
    Foo o = new Bar(); 
    add(o); // calls #dispatch as defined in Bar! 
} 

Le cose potrebbero differiscono leggermente a Scala, se la distinzione generale dovrebbe essere lo stesso di qui presentata in tutte le lingue di programmazione.

+0

Grazie per l'ottimo esempio. – shj

Problemi correlati