Чому неможливо перевантажити функцію лише змінивши тип повернення? Чи зміниться це в майбутній версії 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 може знати, який метод викликати, - це диференціювати типи списку аргументів. Якби компілятор дозволив два методи з тим самим іменем та тими ж типом аргументів, не було б способу визначити, який із них слід викликати.
Компілятор не враховує тип повернення при диференціації методів, тому ви не можете оголосити два методи з однаковою підписом, навіть якщо вони мають інший тип повернення.
Якщо вам відомо про виконання функції, то ви будете знати, що коли ми викликаємо функцію, виконується частина визначення, і, нарешті, нам потрібен оператор повернення, отже, ми можемо сказати, що повернення відбувається після всього визначення функції, ось чому, якщо є дві або більше функцій з тим самим іменем, з тим самим типом і ні. аргументів, то під час виклику того, як компілятор буде знати про те, кого потрібно викликати, оскільки назва функції та параметри однакові. Під час виклику, по-перше, вся увага буде зосереджена на аргументах та імені функції, а після завершення визначення функції нарешті ми матимемо справу із поверненням.
Помилка часу компіляції краще, ніж помилка запуску часу. Отже, компілятор java робить помилку часу компілятора, якщо ви оголошуєте той самий метод, що має однакові параметри.
не дуже можливо, таким чином ви можете перевантажуватися лише відсутністю аргументів або типом даних аргументів