Связь перегрузки и типа возвращаемого метода в Java?


Если существует два метода, они имеют разные параметры, и их типы возвращаемых данных различны. Вот так:

int test(int p) {
   System.out.println("version one");
   return p;
}

boolean test(boolean p, int q) {
   System.out.println("version two");
   return p;
}

Если возвращаемые типы одинаковы, то, конечно, это перегрузка. Но поскольку возвращаемые типы различны , можем ли мы все еще считать это перегрузкой?

4 3

4 ответа:

Рассмотрим следующие моменты для перегрузки:

1) Первое и важное правило для перегрузки метода в java-это изменение сигнатуры метода. Сигнатура метода состоит из числа аргументов, типа аргументов и порядка аргументов, если они имеют разные типы.

public class DemoClass {
    // Overloaded method
    public Integer sum(Integer a, Integer b) {
        return a + b;
    }

    // Overloading method
    public Integer sum(Float a, Integer b) {  //Valid
        return null;
    }
}

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

public class DemoClass {
    // Overloaded method
    public Integer sum(Integer a, Integer b) {
        return a + b;
    }

    // Overloading method
    public Float sum(Integer a, Integer b) {     //Not valid; Compile time error
        return null;
    }
}

3) брошенные исключения от методов также не учитываются при перегрузке метода. Таким образом, ваш перегруженный метод создает одно и то же исключение, другое исключение или он просто не создает никакого исключения; никакого эффекта на загрузку метода.

public class DemoClass {
    // Overloaded method
    public Integer sum(Integer a, Integer b) throws NullPointerException{
        return a + b;
    }

    // Overloading method
    public Integer sum(Integer a, Integer b) throws Exception{  //Not valid; Compile time error
        return null;
    }
}

Процитируем официальный учебник :

Язык программирования Java поддерживает методы перегрузки, и Java может различать методы с различными сигнатурами методов. Это означает, что методы внутри класса могут иметь одно и то же имя, если они имеют разные списки параметров (есть некоторые требования к этому, которые будут рассмотрены в уроке под названием "интерфейсы и наследование").

Наличие другого типа возврата несущественно для перегрузка. На самом деле, это довольно часто встречается с методами, которые возвращают один из своих аргументов. Например., java.util.Math имеет кучу перегруженных методов max. A max из двух ints возвращает an int, a max из двух double S возвращает a double и т. д.

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

Также могут быть полезны сценарии для перегрузки такого метода. Рассмотрим следующий пример:

class Sanitizer {
    public static String sanitize(String s) {
        ...
    }
    public static int sanitize(int s) {
        ...
    }
    public static double sanitize(double s) {
        ...
    }
}

Программист, который использует Sanitizer, может писать такие вещи, как

String s2 = Sanitizer.sanitize(s1);
int num2 = Sanitizer.sanitize(num1);

И перегрузка делает код одинаковым для переменных разных типов.

В функции перегрузки возвращаемые типы не играют никакой роли. Перегрузка функций может быть достигнута только путем изменения аргументов. Итак, да в данном случае test() перегружен