Почему невозможно перегрузить функцию, просто изменив тип возвращаемого значения? Изменится ли это в будущей версии Java?
Кстати, для справки, это возможно в C ++?
Почему невозможно перегрузить функцию, просто изменив тип возвращаемого значения? Изменится ли это в будущей версии Java?
Кстати, для справки, это возможно в C ++?
Ответы:
Вы не можете сделать это на Java и не можете сделать это на C ++. Обоснование состоит в том, что одного только возвращаемого значения компилятору недостаточно, чтобы определить, какую функцию вызывать:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
, это double
.
foo();
без возвращаемого типа был бы неоднозначным, не обязательно является причиной запретить его как перегрузку. Есть аргументы, которые могут вызвать двусмысленность (например foo(null);
), но это не делает перегрузку недействительной по своей сути.
Причина в том, что перегрузки в Java разрешены только для методов с разными сигнатурами .
Тип возвращаемого значения не является частью сигнатуры метода, поэтому его нельзя использовать для распознавания перегрузок.
См. Определение методов из руководств по Java.
calculateAnswer(double, int, double, double)
». Убедитесь, что возвращаемый тип не включен, @konmik.
До версии Java 5.0 при переопределении метода и параметры, и тип возвращаемого значения должны точно совпадать. В Java 5.0 он представляет новое средство, называемое ковариантным возвращаемым типом. Вы можете переопределить метод с той же сигнатурой, но вернуть подкласс возвращенного объекта. Другими словами, метод в подклассе может возвращать объект, тип которого является подклассом типа, возвращенного методом с той же сигнатурой в суперклассе.
Overloaded
методы в java могут иметь разные возвращаемые типы, учитывая, что аргумент также отличается.
Ознакомьтесь с образцом кода.
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
Тип возвращаемого значения не имеет значения при перегрузке метода. Нам просто нужно убедиться, что нет двусмысленности!
Единственный способ, которым Java может узнать, какой метод вызывать, - это различать типы списка аргументов. Если бы компилятор допускал использование двух методов с одним и тем же именем и одними и теми же типами аргументов, не было бы способа определить, какой из них он должен вызвать.
Компилятор не учитывает возвращаемый тип при различении методов, поэтому вы не можете объявить два метода с одной и той же сигнатурой, даже если они имеют другой тип возвращаемого значения.
Если вы знаете о выполнении функции, то вы будете знать, что когда мы вызываем функцию, выполняется ее часть определения, и, наконец, нам требуется оператор return, поэтому мы можем сказать, что return идет после всего определения функции, поэтому, если есть два или больше функций с тем же именем и с тем же типом и нет. аргументов тогда во время вызова, как компилятор узнает, какой из них следует вызвать, потому что имя функции и параметры совпадают. Во время вызова сначала все внимание будет сосредоточено на аргументах и имени функции, а после завершения определения функции, наконец, мы имеем дело с оператором return.
Ошибка времени компиляции лучше, чем ошибка времени выполнения. Итак, компилятор java отображает ошибку времени компилятора, если вы объявляете тот же метод с такими же параметрами.
нет, на самом деле это невозможно, вы можете перегрузить только аргументы или тип данных аргументов