在Java中使用不同的返回类型进行重载?

nun*_*nos 92 java overloading

为什么仅通过更改返回类型来重载函数是不可能的?这将在未来的Java版本中发生变化吗?

那么,仅供参考,这在C++中是否可行?

Ale*_*ler 149

你不能用Java做,也不能用C++做.理由是单独的返回值不足以让编译器找出要调用的函数:

public int foo() {...}
public float foo() {..}

...
foo(); // which one?
Run Code Online (Sandbox Code Playgroud)

  • @nunos即使它是float f = foo(),编译器也无法弄明白,因为int都是float的有效输入.比较浮点数f = 7; (7是浮点数还是整数?) (7认同)
  • @NomeN但是你的陈述表明func(int i)和func(float i)对于编译器来说是无法区分的 - 我们都知道这不是真的.真正的原因是Oded给出的(见下一个答案) - 它是关于方法的签名.而且,顺便说一句.7绝对是整数,而7.0或7f是浮点数;-) (5认同)
  • 7.0不是`float`,它是`double`. (5认同)
  • 没有返回类型的 `foo();` 不明确这一事实不一定是禁止将其作为重载的理由。有些参数可能会导致歧义(例如`foo(null);`),但这不会使重载本质上无效。 (3认同)
  • 我一直以为,如果我们做int i = foo()或float f = foo()之类的事情,它将知道是哪一个,但是如果该语句只是编译器不知道的函数。我知道了 谢谢。 (2认同)

Ode*_*ded 47

原因是Java中的重载仅允许具有不同签名的方法.

返回类型不是方法签名的一部分,因此不能用于区分重载.

请参阅Java教程中的定义方法.

  • 哦"只是因为"!我知道了. (45认同)
  • 但为什么返回类型不是**签名的一部分** (3认同)
  • 返回类型IS是方法签名的一部分.只需看看课程反汇编. (3认同)
  • 是的,因为*返回类型不是签名*的一部分.签名是 - 方法的名称+其参数的类型和顺序.阅读我在答案中提供的链接:"上面声明的方法的签名是:`calculateAnswer(double,int,double,double)`".看到不包括返回类型,@ konmik. (3认同)
  • @andho - 因为这就是签名的定义方式? (2认同)
  • 它真的不是@konmik - 不是通过方法重载的规则.试试吧.相同的方法名称,相同顺序的相同参数类型,不同的返回类型.不会编译. (2认同)
  • 是的,它不会编译,但不会,因为返回类型不是签名的一部分。 (2认同)

Dan*_*kov 22

在Java 5.0之前,当您重写方法时,参数和返回类型必须完全匹配.在Java 5.0中,它引入了一个名为协变返回类型的新工具.您可以使用相同的签名覆盖方法,但返回返回的对象的子类.换句话说,子类中的方法可以返回一个对象,该对象的类型是由超类中具有相同签名的方法返回的类型的子类.

  • 当我第一次看到这个时,我感到很困惑.谢谢你解释为什么这是可能的! (3认同)
  • 对于Java中的新手来说,这个答案听起来可能会产生误导,因为它与**重载**无关,它可以**覆盖** - 完全是另一回事. (3认同)
  • 重载和覆盖是不同的.重载不一定(必然)涉及继承 (2认同)

Abd*_*han 5

Overloaded java中的方法可能有不同的返回类型,因为参数也不同.

查看示例代码.

public class B {

    public String greet() {
        return "Hello";
    }

    //This will work
    public StringBuilder greet(String name) {
        return new StringBuilder("Hello " + name);
    }

    //This will not work
    //Error: Duplicate method greet() in type B
    public StringBuilder greet() {
        return new StringBuilder("Hello Tarzan");
    }

}
Run Code Online (Sandbox Code Playgroud)