Может ли два метода Java иметь одноименное имя с другим возвратом типа? Тип возвращаемых методов отличается, и они объявляются с тем же именем метода.
Разрешено ли это?
Может ли два метода Java иметь одноименное имя с другим возвратом типа? Тип возвращаемых методов отличается, и они объявляются с тем же именем метода.
Разрешено ли это?
Если оба метода имеют одинаковые типы параметров, но имеют другой тип возврата, чем это невозможно. Из Спецификация языка Java, Java SE 8 Edition, §8.4.2. Подпись метода:
Два метода или конструкторы M и N имеют одну и ту же подпись, если они имеют одинаковое имя, параметры одного и того же типа (если они есть) (§8.4.4) и после адаптации формальных типов параметров N к параметры типа M, те же формальные типы параметров.
Если оба метода имеют разные типы параметров (поэтому они имеют различную подпись), тогда это возможно. Это называется перегрузкой.
Только, если они принимают разные параметры. Если параметров нет, вы должны иметь разные имена.
int doSomething(String s);
String doSomething(int); // this is fine
int doSomething(String s);
String doSomething(String s); // this is not
Согласно 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
Для более подробной информации прочитайте мою статью здесь
Нет. С++ и Java обе запрещают перегрузку по возвращаемому типу функций. Причина в том, что перегрузка по возвращаемому типу может сбивать с толку (разработчикам может быть сложно предсказать, какая перегрузка будет вызвана). Фактически, есть те, кто утверждает, что любая перегрузка может сбивать с толку в этом отношении и рекомендовать против нее, но даже те, кто предпочитает перегрузку, похоже, согласны с тем, что эта конкретная форма слишком запутанна.
У вас могут быть два метода с одинаковыми аргументами и разными типами возвращаемых данных, только если один из методов наследуется и типы возврата совместимы.
Например:
public class A
{
Object foo() { return null; }
}
public class B
extends A
{
String foo() { return null; }
}
Только если их объявления параметров отличаются от памяти.
В документации java указано:
Компилятор не рассматривает тип возвращаемого значения при дифференцировании методов, поэтому вы не можете объявлять два метода с одной и той же сигнатурой, даже если они имеют другой тип возврата.
Смотрите: http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
Если он в том же классе с равным количеством параметров с одинаковыми типами и порядком, то это невозможно, например:
int methoda(String a,int b) {
return b;
}
String methoda(String b,int c) {
return b;
}
если количество параметров и их типы одинаковы, но порядок отличается, но это возможно, так как это приводит к перегрузке метода. Это означает, что подпись метода одинакова, включая имя метода с количеством параметров и их типами и порядок, который они определены.
Даже если это старая нить, возможно, некоторые заинтересованы.
Если вы можете использовать один и тот же метод внутри одного класса и архивировать разные типы возвращаемых данных, используйте дженерики: 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 ...