Ambiguità nell'overload del metodo

3

Il libro che sto leggendo su Java afferma qualcosa di confuso e inaccettabile.

Learning About Ambiguity

When you overload methods, you risk creating an ambiguous situation - one which the compiler cannot determine which method to use. For example, consider the following overloaded computeBalance() method declarations:

public static void computeBalance(double deposit)
public static void computeBalance(double withdrawal)

If you declare a double variable named myDeposit and make a method call such as computeBalance(myDeposit);, you will have created an ambiguous situation. Both methods are exact matches for your call. You might argue that a call using a variable named myDeposit "seems" like it should go to the version of the method with the parameter named deposit, but Java makes no assumptions based on variable names. Each version of computeBalance() could accept a double, and Java does not presume which one you intend to use.

Questo viola le regole per sovraccaricare un metodo. Come può essere sovraccaricato un metodo con la stessa lista di parametri? Non è impossibile o non sto ottenendo qualcosa? Ho provato e compilato un codice simile, restituisce il seguente errore (che ha senso):

method computeBalance() is already defined in class XXX
    
posta With A SpiRIT 14.11.2015 - 14:28
fonte

2 risposte

5

Sono d'accordo con la tua valutazione sul fatto che questo è testo sbagliato, sbagliato e / o fuorviante.

Come hai sottolineato, il compilatore si lamenterà basandosi solo su queste dichiarazioni: non è richiesta alcuna chiamata a computeBalance . Queste dichiarazioni prese insieme sono errate, non c'è sovraccarico (legale) in corso qui.

L'idea dal testo che

You might argue that a call using a variable named myDeposit seems like it should go to the version of the method with the parameter named deposit ...

è uno strano suggerimento per non dire altro. Sembra che l'autore stia evocando una situazione ipotetica (adattamento di nomi di variabile (per risolvere sovraccarichi dichiarati erroneamente)) che non è molto a proposito di come funzionano questi linguaggi, ma poi continua dicendo che non funzionano così. Sciocco se me lo chiedi.

Per quello che vale, ci sono esempi molto migliori di sovraccarichi ambigui che potrebbero essere presentati.

Due metodi con lo stesso nome prendono ciascuno un parametro di un tipo diverso (di classe). Quindi chiami quel nome di metodo che passa null . Il compilatore non saprà quale dei sovraccarichi richiamare: dovresti eseguire il cast null su uno di questi tipi.

    
risposta data 14.11.2015 - 17:11
fonte
0

Ovviamente due metodi nell'esempio sono ambigui e il codice non può essere compilato perché entrambi i metodi hanno lo stesso nome e gli stessi parametri.

public static void computeBalance(double deposit)
public static void computeBalance(double withdrawal)

L'autore non afferma che puoi compilare e utilizzare sopra come indicato in

When you overload methods, you risk creating an ambiguous situation - one which the compiler cannot determine which method to use.

e poi

and make a method call such as computeBalance(myDeposit);, you will have created an ambiguous situation. Both methods are exact matches for your call.

e più tardi in

but Java makes no assumptions based on variable names. Each version of computeBalance() could accept a double, and Java does not presume which one you intend to use.

L'unica cosa che l'autore non ha detto esplicitamente nel testo che hai citato è che il codice ambiguo non può essere compilato.

Personalmente, non penso che sia un errore da parte sua e che il suo testo sia in qualche modo fuorviante o confuso, perché dovrebbe essere ovvio da "il compilatore non può determinare quale metodo usare" almeno.

L'autore sta solo creando una situazione ipotetica in cui la persona che legge il codice potrebbe essere in grado di determinare il giusto metodo basato su nomi di variabili e parametri, cercando di spiegare che il compilatore non ha tali capacità e non può vedere un contesto più ampio.

Proprio come nota aggiuntiva. Lingue diverse hanno definizioni diverse che rappresentano una chiamata ambigua. Ad esempio, mentre il compilatore Java non è in grado di sovraccaricare i metodi che hanno lo stesso elenco di parametri ma un tipo di ritorno diverso, il compilatore Swift può.

    
risposta data 15.11.2015 - 13:56
fonte

Leggi altre domande sui tag