Почему невозможно перегрузить функцию, просто изменив тип возвращаемого значения? Изменится ли это в будущей версии Java?
Кстати, для справки, это возможно в C ++?
java
overloading
нуносы
источник
источник
Ответы:
Вы не можете сделать это на Java и не можете сделать это на C ++. Обоснование состоит в том, что одного только возвращаемого значения компилятору недостаточно, чтобы определить, какую функцию вызывать:
источник
float
, этоdouble
.foo();
без возвращаемого типа был бы неоднозначным, не обязательно является причиной запретить его как перегрузку. Есть аргументы, которые могут вызвать двусмысленность (напримерfoo(null);
), но это не делает перегрузку недействительной по своей сути.Причина в том, что перегрузки в Java разрешены только для методов с разными сигнатурами .
Тип возвращаемого значения не является частью сигнатуры метода, поэтому его нельзя использовать для распознавания перегрузок.
См. Определение методов из руководств по Java.
источник
calculateAnswer(double, int, double, double)
». Убедитесь, что возвращаемый тип не включен, @konmik.До версии Java 5.0 при переопределении метода и параметры, и тип возвращаемого значения должны точно совпадать. В Java 5.0 он представляет новое средство, называемое ковариантным возвращаемым типом. Вы можете переопределить метод с той же сигнатурой, но вернуть подкласс возвращенного объекта. Другими словами, метод в подклассе может возвращать объект, тип которого является подклассом типа, возвращенного методом с той же сигнатурой в суперклассе.
источник
Overloaded
методы в java могут иметь разные возвращаемые типы, учитывая, что аргумент также отличается.Ознакомьтесь с образцом кода.
источник
Компилятор не учитывает возвращаемый тип при различении методов, поэтому вы не можете объявить два метода с одной и той же сигнатурой, даже если они имеют другой тип возвращаемого значения.
источник
Тип возвращаемого значения не имеет значения при перегрузке метода. Нам просто нужно убедиться, что нет двусмысленности!
Единственный способ, которым Java может узнать, какой метод вызывать, - это различать типы списка аргументов. Если бы компилятор допускал использование двух методов с одним и тем же именем и одними и теми же типами аргументов, не было бы способа определить, какой из них он должен вызвать.
источник
Компилятор не учитывает возвращаемый тип при различении методов, поэтому вы не можете объявить два метода с одной и той же сигнатурой, даже если они имеют другой тип возвращаемого значения.
Если вы знаете о выполнении функции, то вы будете знать, что когда мы вызываем функцию, выполняется ее часть определения, и, наконец, нам требуется оператор return, поэтому мы можем сказать, что return идет после всего определения функции, поэтому, если есть два или больше функций с тем же именем и с тем же типом и нет. аргументов тогда во время вызова, как компилятор узнает, какой из них следует вызвать, потому что имя функции и параметры совпадают. Во время вызова сначала все внимание будет сосредоточено на аргументах и имени функции, а после завершения определения функции, наконец, мы имеем дело с оператором return.
Ошибка времени компиляции лучше, чем ошибка времени выполнения. Итак, компилятор java отображает ошибку времени компилятора, если вы объявляете тот же метод с такими же параметрами.
источник
нет, на самом деле это невозможно, вы можете перегрузить только аргументы или тип данных аргументов
источник