两个Java方法的方法名相同,但返回类型不同,这种情况允许吗?这些方法的返回类型不同,并且使用相同的方法名声明。
是否允许这样做?
两个Java方法的方法名相同,但返回类型不同,这种情况允许吗?这些方法的返回类型不同,并且使用相同的方法名声明。
是否允许这样做?
如果两种方法具有相同的参数类型,但返回类型不同,则不可能。来自Java语言规范,Java SE 8版,§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
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.util.ArrayList
也不能编译而不带警告(这必须是最基本的用例)。 - Peter Lawrey不允许在C++和Java中基于函数返回类型进行重载。原因是基于返回类型的重载可能会引起混淆(开发人员很难预测将调用哪个重载)。实际上,有些人认为任何形式的重载都可能会在这方面引起混淆,并建议避免使用,但即使是那些支持重载的人似乎也同意这种特定形式太令人困惑。
如果一个方法是继承来的,并且返回类型是兼容的,那么你可以使用相同参数但不同返回类型的两个方法。
例如:
public class A
{
Object foo() { return null; }
}
public class B
extends A
{
String foo() { return null; }
}
B.class.getDeclaredMethods()
,你会看到两个版本都出现了。你可以通过反射调用任意一个版本。 - Adam Burley即使这是一个旧的线程,也许有些人会感兴趣。
如果您可以在同一类中使用相同的方法并存档不同的返回类型,则可以使用泛型: 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 ...
只有当它们的参数声明与内存不同才能生效。
int methoda(String a,int b) {
return b;
}
String methoda(String b,int c) {
return b;
}