Przeciążenie metod (method overloading) to możliwość tworzenia kilku metod o tej samej nazwie, ale z różnymi parametrami (typ, kolejność, liczba) w jednej klasie. Takie podejście pozwala logicznie połączyć podobne operacje i zwiększa czytelność kodu.
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; } }
Pytanie: Czy można przeciążyć metody tylko na podstawie typu zwracanego (bez zmiany parametrów)?
Odpowiedź: Nie. Przeciążenie jest możliwe tylko przy różnicy w liście parametrów. Różnica tylko według typu zwracanego spowoduje błąd kompilacji.
void foo(int a) {} int foo(int a) { return 1; } // Błąd! Typ zwracany nie jest brany pod uwagę przy przeciążaniu.
Historia
W jednym projekcie programista stworzył dwie metody:
public void process(int x, double y) {...} public void process(double x, int y) {...}Przy wywołaniu
process(5, 10), kompilator nie mógł wybrać odpowiedniej wersji, co prowadziło do błędu o niejednoznaczności wywołania. To opóźniało oddanie modułu.
Historia
W aplikacji metody z przeciążeniem na podstawie varargs i tablic:
public void log(String... messages) {...} public void log(String[] messages) {...}Przekazanie tablicy
String[] datanie zawsze wywoływało oczekiwane przeciążenie, przez co niektóre dane były logowane niepoprawnie — część informacji była tracona! Różnica między tablicą a varargs okazała się krytyczna.
Historia
Programista przeciążył metody klasy, nie uwzględniając autowrapowania typów:
public void save(Integer i) {...} public void save(int i) {...}Przy wywołaniu
save(null)wystąpił NullPointerException po stronie wywołania z prymitywnym int, ponieważ Java wybiera najbardziej specyficzny typ (int), ale null nie można przekonwertować na typ prymitywny!