两个Java方法可以具有相同的名称和不同的返回类型吗?

时间:2011-04-06 04:25:29

标签: java methods return-type

两种Java方法的同名可以使用不同的返回类型吗?方法的返回类型是不同的,它们使用相同的方法名称声明。

这是允许的吗?

9 个答案:

答案 0 :(得分:79)

如果两个方法具有相同的参数类型,但返回类型不同,则不可能。来自Java Language Specification, Java SE 8 Edition, §8.4.2. Method Signature

  

两个方法或构造函数M和N具有相同的签名,如果它们具有相同的名称,相同的类型参数(如果有的话)(第8.4.4节),并且在将形式参数类型N调整为M的类型参数,相同的形式参数类型。

如果两种方法都有不同的参数类型(因此,它们具有不同的签名),那么它是可能的。它被称为重载。

答案 1 :(得分:32)

仅限,如果他们接受不同的参数。如果没有参数,那么您必须有不同的名称。

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


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

答案 2 :(得分:19)

根据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

有关详细信息,请read my article here

答案 3 :(得分:6)

没有。 C ++和Java都禁止在函数的返回类型上进行重载。原因是返回类型的重载可能会令人困惑(开发人员很难预测将调用哪个重载)。事实上,有些人认为任何超载都可能在这方面令人困惑,并建议反对它,但即使是那些支持超载的人也似乎同意这种特殊形式太混乱了。

答案 4 :(得分:4)

只有在继承其中一个方法且返回类型兼容的情况下,才能有两个具有相同参数和不同返回类型的方法。

例如:

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

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

答案 5 :(得分:2)

仅当他们的参数声明与内存不同时。

答案 6 :(得分:2)

java文档声明:

  

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

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

答案 7 :(得分:2)

即使它是一个旧线程,也许有些人感兴趣。

如果您可以选择在同一个类中使用相同的方法并归档不同的返回类型,请使用泛型: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 ...

答案 8 :(得分:1)

如果它在同一个类中具有相同数量的参数且具有相同的类型和顺序, 那么例如:

是不可能的
int methoda(String a,int b) {
        return b;
}
String methoda(String b,int c) {
        return b;    
}

如果参数的数量及其类型相同但顺序不同则可能因为它导致方法重载。这意味着方法签名是否相同,包括方法名称,参数数量及其类型以及定义它们的顺序。