Можно ли перегрузить метод в Java, изменив только возвращаемый тип?

«Можно ли перегрузить метод в Java, изменив только возвращаемый тип?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, нельзя. Перегрузка метода (method overloading) требует различий в сигнатуре параметров (тип, количество или порядок). Если имена методов и списки параметров идентичны, компилятор выдаст ошибку, даже если возвращаемые типы разные.

Пример, который не скомпилируется:

class Example {
    // ОШИБКА: method sum(int, int) is already defined
    int sum(int a, int b) { return a + b; }
    double sum(int a, int b) { return (double)(a + b); }
}

Почему это запрещено? В многих контекстах компилятор не может определить, какую версию метода вызвать, основываясь только на ожидаемом типе возвращаемого значения.

// Неоднозначность: какую sum() вызвать?
example.sum(5, 10);

Важное исключение — ковариантный возвращаемый тип: При переопределении метода (overriding) в подклассе можно сузить (уточнить) тип возвращаемого значения.

class Animal {
    Animal get() { return this; }
}

class Dog extends Animal {
    @Override
    Dog get() { return this; } // Корректно: возвращаемый тип Dog — подтип Animal
}