Может ли два метода 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 ...