Могут ли два метода Java иметь одинаковые имена с разными типами возвращаемых данных?
Могут ли два метода Java иметь одно и то же имя с разным типом возвращаемого значения? Тип возвращаемого значения методов различен, и они объявлены с тем же именем метода.
Это разрешено?
9 ответов
Если оба метода имеют одинаковые типы параметров, но другой тип возвращаемого значения, чем это невозможно. Из спецификации языка Java, Java SE 8 Edition, §8.4.2. Подпись метода:
Два метода или конструктора, M и N, имеют одинаковую сигнатуру, если они имеют одинаковое имя, одинаковые параметры типа (если есть) (§8.4.4) и после адаптации формальных параметров типа N к параметрам типа М, те же формальные типы параметров.
Если оба метода имеют разные типы параметров (поэтому они имеют разную сигнатуру), то это возможно. Это называется перегрузкой.
Только если они принимают разные параметры. Если параметров нет, то у вас должны быть разные имена.
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
Для более подробной информации, прочитайте мою статью здесь
Нет. C++ и Java запрещают перегрузку возвращаемого типа функции. Причина в том, что перегрузка возвращаемого типа может сбивать с толку (разработчикам может быть сложно предсказать, какая перегрузка будет вызвана). Фактически, есть те, кто утверждает, что любая перегрузка может сбить с толку в этом отношении, и рекомендует против этого, но даже те, кто предпочитает перегрузку, похоже, согласны с тем, что эта конкретная форма слишком запутанная.
Вы можете иметь два метода с одинаковыми аргументами и разными типами возвращаемых данных, только если один из методов наследуется и возвращаемые типы являются совместимыми.
Например:
public class A
{
Object foo() { return null; }
}
public class B
extends A
{
String foo() { return null; }
}
Даже если это старая ветка, возможно, кому-то это интересно.
Если у вас есть возможность использовать один и тот же метод внутри одного и того же класса и архивировать разные типы возвращаемых данных, используйте обобщенные типы: 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 ...
Документация 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;
}
если число параметров и их типов одинаково, но порядок отличается, то это возможно, поскольку это приводит к перегрузке метода. Это означает, что если сигнатура метода одна и та же, которая включает имя метода с количеством параметров и их типами, а также порядок их определения.