Перегрузка с другим типом возврата в Java? - PullRequest
85 голосов
/ 13 марта 2010

Почему невозможно перегрузить функцию, просто изменив тип возвращаемого значения? Изменится ли это в будущей версии Java?

Кстати, просто для справки, возможно ли это в C ++?

Ответы [ 8 ]

142 голосов
/ 13 марта 2010

Вы не можете сделать это в Java, и вы не можете сделать это в C ++. Смысл в том, что одного возвращаемого значения недостаточно, чтобы компилятор выяснил, какую функцию вызывать:

public int foo() {...}
public float foo() {..}

...
foo(); // which one?
46 голосов
/ 13 марта 2010

Причина в том, что перегрузки в Java разрешены только для методов с разными сигнатурами .

Тип возвращаемого значения не является частью сигнатуры метода, поэтому его нельзя использовать для различения перегрузок.

См. Определение методов из учебников по Java.

22 голосов
/ 19 января 2013

До Java 5.0, когда вы переопределяете метод, оба параметра и тип возвращаемого значения должны точно совпадать. В Java 5.0 он представляет новое средство под названием ковариантный тип возврата. Вы можете переопределить метод с той же сигнатурой, но возвращает подкласс возвращаемого объекта. Другими словами, метод в подклассе может возвращать объект, тип которого является подклассом типа, возвращаемого методом с той же сигнатурой в суперклассе.

5 голосов
/ 15 октября 2016

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");
    }

}
1 голос
/ 18 июля 2016

Тип возвращаемого значения не имеет значения при перегрузке метода. Нам просто нужно убедиться, что нет двусмысленности!

Единственный способ, которым Java может узнать, какой метод вызывать, это дифференцировать типы списка аргументов. Если бы компилятор разрешил два метода с одинаковым именем и одинаковыми типами аргументов, невозможно было бы определить, какой из них он должен вызывать.

1 голос
/ 23 июля 2013

Компилятор не учитывает тип возвращаемого значения при различении методов, поэтому вы не можете объявить два метода с одинаковой сигнатурой, даже если они имеют другой тип возвращаемого значения.

0 голосов
/ 17 июля 2017

Компилятор не учитывает тип возвращаемого значения при различении методов, поэтому вы не можете объявить два метода с одинаковой сигнатурой, даже если они имеют другой тип возвращаемого значения.

Если вам известно о выполнении функции, то вы будете знать, что когда мы вызываем функцию, часть определения выполняется, и, наконец, нам требуется оператор return, поэтому мы можем сказать, что return идет после полного определения функции, поэтому, если есть две или более функций с тем же именем и с тем же типом и нет. аргументов, то во время вызова, как компилятор узнает, какой из них вызывать, потому что имя функции и параметры совпадают. Во время вызова сначала все внимание будет уделено аргументам и имени функции, а после завершения определения функции, наконец, мы имеем дело с оператором возврата.

Ошибка времени компиляции лучше, чем Ошибка времени выполнения. Таким образом, Java-компилятор отображает ошибку времени компилятора, если вы объявляете тот же метод, имеющий те же параметры.

0 голосов
/ 27 февраля 2017

нет, на самом деле это невозможно, так как вы можете перегружать только аргументы или типы данных аргументов

...