Перегрузка с другим типом возврата в Java?
Почему невозможно перегрузить функцию, просто изменив тип возвращаемого значения? Изменится ли это в будущей версии Java?
кстати, просто для справки, это возможно в C++?
8 ответов:
вы не можете сделать это в Java, и вы не можете сделать это в C++. Обоснование заключается в том, что одного возвращаемого значения недостаточно для компилятора, чтобы выяснить, какую функцию вызывать:
public int foo() {...} public float foo() {..} ... foo(); // which one?
причина в том, что перегрузки в Java разрешены только для методов с разными подписи.
возвращаемый тип не является частью сигнатуры метода, поэтому его нельзя использовать для различения перегрузок.
посмотреть Определение Методов из учебников Java.
перед Java 5.0, когда вы переопределяете метод, оба параметра и возвращаемый тип должны точно совпадать. В Java 5.0 он вводит новый объект, называемый ковариантным типом возврата. Можно переопределить метод с той же сигнатурой, но возвращает подкласс возвращаемого объекта. Другими словами, метод в подклассе может возвращать объект, тип которого является подклассом типа, возвращаемого методом с той же подписью в суперклассе.
Overloaded
методы в java могут иметь разные типы возвращаемых данных, учитывая, что списки аргументов также различны.
компилятор не учитывает тип возвращаемого значения при дифференцировании методов, поэтому вы не можете объявить два метода с одинаковой сигнатурой, даже если они имеют другой тип возвращаемого значения.
возвращаемый тип не имеет значения при перегрузке метода. Нам просто нужно убедиться, что нет никакой двусмысленности!
единственный способ, которым Java может знать, какой метод вызывать, - это дифференцировать типы списка аргументов. Если компилятор разрешил два метода с одинаковым именем и одинаковыми типами аргументов, не было бы никакого способа определить, какой из них он должен вызывать.
компилятор не учитывает тип возвращаемого значения при дифференцировании методов, поэтому вы не можете объявить два метода с одинаковой сигнатурой, даже если они имеют другой тип возвращаемого значения.
Если вы знаете о выполнении функции, то вы будете знать, что при вызове функции выполняется часть определения и, наконец, нам требуется оператор return, поэтому мы можем сказать, что return приходит после полного определения функции, поэтому, если есть две или более функций с одинаковым именем и с таким же типом и нет. аргументов тогда во время вызова как компилятор будет знать о том, какой из них должен быть вызван, потому что имя функции и параметры одинаковы. Во время вызова сначала все внимание будет сосредоточено на аргументах и имени функции, а после завершения определения функции, наконец, мы имеем дело с оператором return.
Ошибка времени компиляции лучше, чем ошибка времени выполнения. Таким образом, компилятор java отображает ошибку времени компилятора, если вы объявляете тот же метод, имеющий тот же самый параметры.