Перегрузка методов (method overloading) — это возможность создания нескольких методов с одинаковым именем, но разными параметрами (тип, порядок, количество) в одном классе. Такой подход позволяет логически объединить схожие операции и повысить читаемость кода.
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; } }
Вопрос: Можно ли перегрузить методы только по возвращаемому типу (без изменения параметров)?
Ответ: Нет. Перегрузка возможна только при различии в списке параметров. Различие только по возвращаемому типу приведёт к ошибке компиляции.
void foo(int a) {} int foo(int a) { return 1; } // Ошибка! Возвращаемый тип не учитывается при перегрузке.
История
В одном проекте разработчик создал два метода:
public void process(int x, double y) {...} public void process(double x, int y) {...}При вызове
process(5, 10), компилятор не может выбрать нужную версию, что приводило к ошибке о неоднозначности вызова. Это тормозило сдачу модуля.
История
В приложении методы с перегрузкой на основе varargs и массивов:
public void log(String... messages) {...} public void log(String[] messages) {...}Передача массива
String[] dataне всегда вызывала ожидаемую перегрузку, из-за чего одни данные логгировались неправильно — часть информации терялась! Различие между массивом и varargs оказалось критичным.
История
Разработчик перегрузил методы класса, не принимая во внимание автоупаковку типов:
public void save(Integer i) {...} public void save(int i) {...}При вызове
save(null)произошёл NullPointerException на стороне вызова с primitive int, поскольку Java выбирает наиболее специфичный тип (int), но null нельзя преобразовать в примитив!