Ответ
Нет, нельзя. Перегрузка метода (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
}