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