Перегрузка с другим возвращаемым типом в Java?

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

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

Ответ 1

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

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

...
foo(); // which one?

Ответ 2

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

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

Смотрите Определение методов из учебных пособий Java.

Ответ 3

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

Ответ 4

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

}

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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