Il sovraccarico dei metodi (method overloading) è la possibilità di creare più metodi con lo stesso nome ma con parametri diversi (tipo, ordine, numero) all'interno di una classe. Questo approccio consente di raggruppare logicamente operazioni simili e migliorare la leggibilità del codice.
public class MathUtil { public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; } public int sum(int a, int b, int c) { return a + b + c; } }
Domanda: È possibile sovraccaricare i metodi solo in base al tipo restituito (senza modificare i parametri)?
Risposta: No. Il sovraccarico è possibile solo con una differenza nell'elenco dei parametri. Differenze solo nel tipo restituito porteranno a un errore di compilazione.
void foo(int a) {} int foo(int a) { return 1; } // Errore! Il tipo restituito non è considerato nel sovraccarico.
Storia
In un progetto, uno sviluppatore ha creato due metodi:
public void process(int x, double y) {...} public void process(double x, int y) {...}Alla chiamata
process(5, 10), il compilatore non riesce a scegliere la versione corretta, causando un errore di ambiguità nella chiamata. Questo rallentava la consegna del modulo.
Storia
Nell'applicazione, metodi sovraccaricati basati su varargs e array:
public void log(String... messages) {...} public void log(String[] messages) {...}Passare un array
String[] datanon innescava sempre il sovraccarico previsto, causando una registrazione scorretta di alcune informazioni — parte delle informazioni andava persa! La differenza tra array e varargs si è rivelata critica.
Storia
Uno sviluppatore ha sovraccaricato i metodi di una classe, non tenendo conto dell'auto-boxing dei tipi:
public void save(Integer i) {...} public void save(int i) {...}Chiamando
save(null)si è verificato un NullPointerException sul lato della chiamata con il tipo primitivo int, poiché Java sceglie il tipo più specifico (int), ma null non può essere convertito in primitivo!