2009-11-04 8 views
5

È possibile avere due metodi con lo stesso nome ma diversi parametri e tipi di ritorno in Java? Sembra che sarebbe un buon modo per generalizzare un semplice getter e setter .. Puoi farlo con costruttori perché non con metodi regolari? per esempioquindi in java non puoi avere nomi di metodi duplicati con diversi valori restituiti e parametri?

perché non essere in grado di fare ..

int getVal() { 

return int; 
} 

boolean getVal() { 

return true; 

} 

setVal(int a) { 
} 

e

setVal(boolean a) { 

} 
+0

possibile duplicato di [Java - perché nessuno tipo di ritorno basato overloading dei metodi] (http://stackoverflow.com/questions/2744511/java-why-no-return-type-based-method-overloading) – nawfal

risposta

11

Perché allora il compilatore non sarebbe in grado di capire:

 
setVal(getVal()); 

dovrebbe chiamare la versione bool o int?

+0

se riceve un booleano come parametro, quindi dovrebbe usare il setVal che accetta e imposta un valore booleano – Ayrad

+0

come quando un costruttore accetta parametri diversi ma può avere lo stesso nome – Ayrad

+4

Ma come potrebbe il compilatore selezionare la versione bool di getVal in primo luogo? Ha chiaramente due scelte ugualmente valide. –

15

Cosa ci si può aspettare se ho chiamato:

getVal(); 

senza vaue ritorno sono raccolti ? Hai due scelte: la variante booleana o quella intera. Poiché non è possibile imporre il valore restituito da raccogliere, il compilatore non può determinare quale variante deve essere chiamata.

È possibile sovraccaricare i parametri del metodo, ma non solo sui tipi restituiti, poiché ciò è ambiguo (come mostrato sopra).

+0

idealmente se è un booleano che lo chiama .. per esempio .. if (getVal == true) allora dovrebbe chiamare il getVal che restituisce un vero .. altrimenti se è int a = getVal() dovrebbe chiamare il uno che restituisce un int. – Ayrad

+2

Come ho illustrato, non è possibile * forzare * un valore di ritorno su questo –

3

Tipi di reso diversi, n. Ma diversi tipi di parametri/lunghezza, sì. Ecco come è Java ... le specifiche lo dicono. Volevano che fosse semplice.

+0

Lo stesso vale per C++. – Raze

6

A prima vista potrebbe sembrare che non ci dovrebbe essere alcuna ragione per cui non si dovrebbe consentire a questo, ma comunque pensateci dal punto di vista del codice che deve chiamare questo (i) metodo (i), come Saprebbe quale metodo invocare?

Da java.sun.com

Il linguaggio di programmazione Java supporta sovraccarico metodi, e Java possono distinguere tra metodi con diverse firme del metodo. Ciò significa che i metodi all'interno di una classe possono avere lo stesso nome se hanno elenchi di parametri diversi (ci sono alcune qualifiche a questo argomento che verranno discusse nella lezione intitolata "Interfacce ed Ereditarietà").

I metodi di overload sono differenziati dal numero e dal tipo di argomenti passati nel metodo.

Non è possibile dichiarare più di un metodo con lo stesso nome e lo stesso numero e tipo di argomenti, perché il compilatore non può dire loro APAR t.

Il compilatore non considera il tipo restituito quando si differenziano i metodi, quindi non è possibile dichiarare due metodi con la stessa firma anche se hanno un tipo di ritorno diverso.

+0

In realtà esiste un motivo: tipi di ritorno covarianti che utilizzano i metodi bridge. – eljenso

+0

Il compilatore non può. Ma jvm può. J –

5

Per quanto riguarda la Virtual Machine Java è interessato, è possibile per una classe di dichiarare più metodi con la stessa firma, ma diversi tipi di ritorno.

Solo, Java come lingua vieta questo.

0

È possibile dichiarare i due setter nel tuo caso - prova.

I metodi devono essere univoci in termini di nome e numero e tipo dei relativi argomenti. Il tipo restituito, così come la clausola throws, non contano in termini di creazione di un metodo univoco (il che ha senso, poiché non vengono specificati quando si invoca ).

4

In generale - no. Ma se si vuole moltissimo - poi YES :)) Scegli questa great article

+0

+2 per l'articolo interessante, -1 per l'* orrore * delle persone pensanti potrebbe effettivamente farlo. :-P –

+0

Pienamente d'accordo con te. Una situazione in cui sarà * veramente * necessario - codice legacy in cui aggiungere facilmente un nuovo hook di riscrivere tutto. –

+0

È un'ottima scoperta! – Raze

0

In base alle specifiche Java Language (http://docs.oracle.com/javase/specs/jls/se5.0/html /classes.html#8.4.2):

è un errore di compilazione dichiarare due metodi con firme di override-equivalenti (definiti di seguito) in una classe.

Due metodi hanno la stessa firma se hanno lo stesso nome e tipi di argomento .

Problemi correlati