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

jen*_*fer 83 java methods return-type

两个Java方法可以使用不同的返回类型具有相同的名称吗?方法的返回类型不同,它们使用相同的方法名称声明.

这是允许的吗?

uth*_*ark 80

如果两个方法都具有相同的参数类型,但返回类型不同,则不可能.来自Java语言规范,Java SE 8 Edition,§8.4.2.方法签名:

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

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

  • +1用于链接到规范...并且正确且清晰. (8认同)

Kai*_*aja 32

只有,如果他们接受不同的参数.如果没有参数,则必须具有不同的名称.

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


int doSomething(String s);
String doSomething(String s); // this is not
Run Code Online (Sandbox Code Playgroud)


Pet*_*rey 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

打印

here - Integer
here - Short
here - Byte
here - Void
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请阅读此处的文章

  • JLS确实允许这4种方法,即使它们具有相同的返回类型.在讨论重载时,实际上根本不考虑返回类型(#8.4.2).因此,根据当前语言规范,允许这4种方法不是错误.但是,如果javac具有相同的返回类型,则无法编译它们 - *是*一个错误.这是对错误有罪的语言规范; 他们没有仔细考虑整个仿制药的事情. (2认同)

Mic*_*yan 6

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

  • 是的,但这不是对返回类型的重载,而是对参数类型的重载。并且重载恰好具有不同的返回类型(返回类型与重载完全无关)。 (2认同)

Tof*_*eer 6

只有当其中一个方法被继承并且返回类型兼容时,您才能拥有两个具有相同参数和不同返回类型的方法。

例如:

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

public class B
    extends A
{
    String foo() { return null; }
}
Run Code Online (Sandbox Code Playgroud)

  • 确实,我今天早些时候才发现这一点。如果您调用“B.class.getDeclaredMethods()”,您将看到它们都出现。您可以通过反射调用任一版本。 (2认同)

Chr*_*ris 2

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