Почему тип возвращаемого значения не учитывается при дифференциации методов?

Возможный дубликат:
Java - почему нет перегрузки метода на основе возвращаемого типа?

Компилятор не учитывает тип возвращаемого значения при различении методов, поэтому вы не можете объявить два метода с одинаковой сигнатурой, даже если они имеют разные типы возвращаемого значения.
Учебник по Java

Почему это?


person Silent Warrior    schedule 16.06.2010    source источник


Ответы (5)


Потому что не требуется назначать результат, когда вы хотите выполнить метод. Как тогда компилятор узнает, какой из перегруженных методов вы хотите вызвать? Будет неясность.

person BalusC    schedule 16.06.2010
comment
Что происходит с возвращаемыми значениями, если они не присвоены? Они просто получают GC'd? - person Pierreten; 16.06.2010
comment
@Pierreten: Если нигде не упоминается (например, внутри метода), то да. - person BalusC; 16.06.2010

Потому что вы не можете сказать только по вызову метода, каким должен быть возвращаемый тип. Компилятор должен иметь возможность сказать, используя только информацию в месте вызова, какой метод вызывать. Возвращаемые значения могут быть отброшены, поэтому вы вообще не можете знать, есть ли возвращаемое значение и каков его тип. это становится еще более запутанным, когда вы начинаете думать о приведении типов (short->int) или приведениях.

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

person luke    schedule 16.06.2010

Потому что вызывающий метод должен будет передать возвращаемый тип вызываемому методу.

Так что у тебя есть

Public Integer doStuff(String thing) { };

а также

Public Double doStuff(String thing) { };

Класс, вызывающий doStuff, должен будет указать классу использовать doStuff, который принимает строку (уже делает) и возвращает Double (не делает).

Причина, ПОЧЕМУ Java делает это? Чтобы помочь предотвратить ужасный код, как я перечислил выше, я предполагаю :) С перегрузкой легко испортить, и я не уверен, что вижу преимущество в случае выше.

person bwawok    schedule 16.06.2010

Любой конкретный сайт вызова может успешно использовать ряд различных типов возврата, по крайней мере, из-за полиморфизма и автоматического (распаковывания) упаковки, поэтому для этого потребуются либо правила для обработки неоднозначных случаев, либо работа только в простых обстоятельствах.

person pdbartlett    schedule 16.06.2010

Я просто хотел указать, что, хотя это и невозможно в Java, Ада поддерживает перегрузку, основанную исключительно на возвращаемых типах. Тем не менее, лучшее объяснение Google о том, как это работает, — это сообщение о переполнении стека:

Перегрузка функции по типу возвращаемого значения?

person nd.    schedule 16.06.2010