Перегрузка с другим типом возврата в Java?
Почему невозможно перегрузить функцию, просто изменив тип возвращаемого значения? Изменится ли это в будущей версии Java?
Кстати, просто для справки, возможно ли это в C++?
10 ответов
Вы не можете сделать это в Java, и вы не можете сделать это в C++. Смысл в том, что одного возвращаемого значения недостаточно, чтобы компилятор выяснил, какую функцию вызывать:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
Причина в том, что перегрузки в Java разрешены только для методов с разными сигнатурами.
Тип возвращаемого значения не является частью сигнатуры метода, поэтому его нельзя использовать для распознавания перегрузок.
См. Определение методов из учебников по Java.
До 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");
}
}
Компилятор не учитывает тип возвращаемого значения при различении методов, поэтому вы не можете объявить два метода с одинаковой сигнатурой, даже если они имеют другой тип возвращаемого значения.
Компилятор не учитывает тип возвращаемого значения при различении методов, поэтому вы не можете объявить два метода с одинаковой сигнатурой, даже если они имеют другой тип возвращаемого значения.
Если вам известно о выполнении функции, то вы будете знать, что когда мы вызываем функцию, часть определения выполняется, и, наконец, нам требуется оператор return, поэтому мы можем сказать, что return идет после полного определения функции, поэтому, если есть два или больше функций с тем же именем и с тем же типом и нет. аргументов во время вызова, как компилятор узнает, какой из них вызывать, потому что имя функции и параметры совпадают. Во время вызова сначала все внимание будет уделено аргументам и имени функции, а после завершения определения функции, наконец, мы имеем дело с оператором return.
Ошибка времени компиляции лучше, чем ошибка времени выполнения. Таким образом, Java-компилятор отображает ошибку времени компилятора, если вы объявляете один и тот же метод с одинаковыми параметрами.
Тип возвращаемого значения не имеет значения при перегрузке метода. Нам просто нужно убедиться, что нет двусмысленности!
Единственный способ, которым Java может узнать, какой метод вызывать, это дифференцировать типы списка аргументов. Если бы компилятор разрешил два метода с одинаковыми именами и одинаковыми типами аргументов, невозможно было бы определить, какой из них он должен вызывать.
Перегруженный метод полностью отличается от любого другого метода с таким же именем. Перегрузка - это не что иное, как повторное использование имени.
public int division(int a, int b){
int result = a/b;
return result;
}
public double division (float a, float b){
double result = a/b;
return result;
}
я почти уверен, что в java 8
все хорошо
Нет, на самом деле это невозможно, так как вы можете перегружать только аргументы или типы данных аргументов.