Может ли два метода Java иметь одинаковое имя с разными типами возвращаемых данных?

Может ли два метода Java иметь одноименное имя с другим возвратом типа? Тип возвращаемых методов отличается, и они объявляются с тем же именем метода.

Разрешено ли это?

Ответ 1

Если оба метода имеют одинаковые типы параметров, но имеют другой тип возврата, чем это невозможно. Из Спецификация языка Java, Java SE 8 Edition, §8.4.2. Подпись метода:

Два метода или конструкторы M и N имеют одну и ту же подпись, если они имеют одинаковое имя, параметры одного и того же типа (если они есть) (§8.4.4) и после адаптации формальных типов параметров N к параметры типа M, те же формальные типы параметров.

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

Ответ 2

Только, если они принимают разные параметры. Если параметров нет, вы должны иметь разные имена.

int doSomething(String s);
String doSomething(int); // this is fine


int doSomething(String s);
String doSomething(String s); // this is not

Ответ 3

Согласно JLS, вы не можете, однако, из-за функции/ошибки в компиляторе Java 6/7 (Oracle JDK, OpenJDK, IBM JDK), вы можете иметь разные типы возвращаемых данных для одной и той же сигнатуры метода, если используете дженерики.

public class Main {
    public static void main(String... args) {
        Main.<Integer>print();
        Main.<Short>print();
        Main.<Byte>print();
        Main.<Void>print();
    }

    public static <T extends Integer> int print() {
        System.out.println("here - Integer");
        return 0;
    }
    public static <T extends Short> short print() {
        System.out.println("here - Short");
        return 0;
    }
    public static <T extends Byte> byte print() {
        System.out.println("here - Byte");
        return 0;
    }
    public static <T extends Void> void print() {
        System.out.println("here - Void");
    }
}

Печать

here - Integer
here - Short
here - Byte
here - Void

Для более подробной информации прочитайте мою статью здесь

Ответ 4

Нет. С++ и Java обе запрещают перегрузку по возвращаемому типу функций. Причина в том, что перегрузка по возвращаемому типу может сбивать с толку (разработчикам может быть сложно предсказать, какая перегрузка будет вызвана). Фактически, есть те, кто утверждает, что любая перегрузка может сбивать с толку в этом отношении и рекомендовать против нее, но даже те, кто предпочитает перегрузку, похоже, согласны с тем, что эта конкретная форма слишком запутанна.

Ответ 5

У вас могут быть два метода с одинаковыми аргументами и разными типами возвращаемых данных, только если один из методов наследуется и типы возврата совместимы.

Например:

public class A
{
    Object foo() { return null; }
}

public class B
    extends A
{
    String foo() { return null; }
}

Ответ 6

Только если их объявления параметров отличаются от памяти.

Ответ 7

В документации java указано:

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

Смотрите: http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

Ответ 8

Если он в том же классе с равным количеством параметров с одинаковыми типами и порядком, то это невозможно, например:

int methoda(String a,int b) {
        return b;
}
String methoda(String b,int c) {
        return b;    
}

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

Ответ 9

Даже если это старая нить, возможно, некоторые заинтересованы.

Если вы можете использовать один и тот же метод внутри одного класса и архивировать разные типы возвращаемых данных, используйте дженерики: Oracle Lesson Generics

Простой пример для класса универсального значения:

class GenericValue<T> {
  private T myValue;

  public GenericValue(T myValue) { this.myValue = myValue; }

  public T getVal() { return myValue; }
}

И используйте его следующим образом:

public class ExampleGenericValue {
  public static void main(String[] args) {
    GenericValue<Integer> intVal = new GenericValue<Integer>(10);
    GenericValue<String> strVal = new GenericValue<String>("go on ...");

    System.out.format("I: %d\nS: %s\n", intVal.getVal(), strVal.getVal());
  }
}

... приведет к следующему выводу:

I: 10
S: go on ...