两个Java方法可以有不同的返回types的同名吗?

两个Java方法可以使用不同的返回types具有相同的名称吗? 方法的返回types是不同的,它们用相同方法的名字声明。

这是允许的吗?

如果两种方法的参数types相同,但返回types不同则不可能。 从Java语言规范,Java SE 8 Edition,§8.4.2。 方法签名 :

如果两个方法或构造方法(M和N)具有相同的名称,相同的types参数(如果有)(第8.4.4节),并且在将N的forms参数types适配到types参数M,相同的forms参数types。

如果两种方法都有不同的参数types(所以他们有不同的签名),那么这是可能的。 它被称为超载。

只有他们接受不同的参数。 如果没有参数,那么你必须有不同的名字。

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

根据JLS,如果使用generics,则不能由于Java 6/7编译器(Oracle的JDK,OpenJDK,IBM的JDK)中的function/错误而针对相同方法签名具有不同的返回types。

 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都不允许在函数的返回types上重载。 原因是返回types的重载可能会造成混淆(开发人员可能很难预测哪个超载会被调用)。 事实上,有人认为任何超载都可能会混淆这个方面,并build议反对,甚至那些赞成超载的人似乎也认同这种特殊的forms太混乱了。

只有当其中一个方法被inheritance并且返回types兼容时,才可以有两个具有相同参数和不同返回types的方法。

例如:

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

只有当它们的参数声明与内存不同时。

java文档指出:

编译器在区分方法时不考虑返回types,所以即使它们具有不同的返回types,也不能声明具有相同签名的两个方法。

请参阅: http : //docs.oracle.com/javase/tutorial/java/javaOO/methods.html

如果在相同的类中,具有相同types和顺序的相同数量的参数,则不可能例如:

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

如果参数的数量和types是相同的,但顺序是不同的,那么可能会导致方法重载。 这意味着如果方法签名是相同的,其中包括方法名称与参数的数量和types以及它们定义的顺序。

即使这是一个古老的线索,也许有些人感兴趣。

如果您可以select在一个类中使用相同的方法并归档不同的返回types,请使用generics: Oracle Lessongenerics

通用值持有者类的简单示例:

 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 ...