用Java中的不同返回类型重载?


104

为什么仅通过更改返回类型就不可能重载函数?将来的Java版本会改变吗?

顺便说一句,仅供参考,这在C ++中可能吗?



KNU,另一个答案的不同之处在于,它以通用的,非语言特定的术语来询问问题。同样有趣的是,其他问题的可接受答案通过指定Java JVM确实允许通过内部操作来完成。
J Woodchuck

Answers:


157

您无法在Java中做到这一点,也无法在C ++中做到这一点。这样做的理由是,仅返回值不足以使编译器确定要调用的函数:

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

...
foo(); // which one?

3
我一直以为,如果我们做类似int i = foo()或float f = foo()的事情,它将知道是哪一个,但是如果该语句只是编译器不知道的函数。我知道了 谢谢。
nunos 2010年

7
@nunos即使它是浮点数f = foo(),编译器也无法弄清楚,因为两个int都是浮点数的有效输入。比较浮点数f = 7; (是7个浮点数还是整数?)
2010年

5
@NomeN但是您的声明表明func(int i)和func(float i)对于编译器是无法区分的-我们都知道这是不正确的。真正的原因是由Oded给出的(请参阅下一个答案)-这与方法的签名有关。而且,顺便说一句。7绝对是整数,而7.0或7f是浮点型;-)
Ta Sas

7
7.0不是float,是double
fredoverflow

3
foo();没有返回类型将是模棱两可的事实,不一定是不允许将其作为重载的理由。有些参数可能引起歧义(例如foo(null);),但不会使重载固有地无效。
shmosel

48

原因是Java中的重载仅适用于具有不同签名的方法。

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

请参阅Java教程中的“ 定义方法 ”。


4
但是,为什么返回类型不是签名的
andho 2013年

51
哦,“只是因为”!我懂了。
andho

3
返回类型是方法签名的一部分。只是研究类的反汇编。
konmik

2
确实不是@konmik-不是按方法重载的规则。试试吧。方法名称相同,参数顺序相同的参数类型,返回类型不同。不会编译。
奥德

3
是的,因为返回类型不是signature的一部分。签名是-方法名称+参数的类型和顺序。阅读我在答案中提供的链接:“上面声明的方法的签名为:calculateAnswer(double, int, double, double)”。看到不包括返回类型@konmik。
奥德

22

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


3
当我第一次看到这个时,我感到困惑。感谢您解释为什么这是可能的!
Dylan Knowles

2
重载和重载是不同的。重载不(不一定)涉及继承
senseiwu

3
对于Java的新手来说,这个答案可能会引起误解,因为它根本与重载无关,而是重载 -完全是另一回事。
azizbekian

4

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");
    }

}

基本上不考虑返回类型,仅考虑参数,悲伤而真实
Alexander Mills

1

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


1

重载方法时,返回类型无关紧要。我们只需要确保没有歧义!

Java知道调用哪种方法的唯一方法是区分参数列表的类型。如果编译器允许两个具有相同名称和参数类型的方法,则无法确定应调用哪个方法。


0

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

如果您知道函数的执行,那么您会知道,当我们调用函数时,定义部分将执行,最后我们需要return语句,因此我们可以说return是在函数的整个定义之后出现的,这就是为什么有两个或多个具有相同名称,相同类型和否的更多函数。那么在调用时,由于函数名称和参数相同,因此在调用编译器时将如何知道要调用哪个参数。首先调用时,所有焦点都将放在参数和函数名称上,最后在函数定义完成后,我们将处理return语句。

编译时错误比运行时错误要好。因此,如果您声明具有相同参数的相同方法,则Java编译器将呈现编译器时间错误。


这与接受的答案有何不同?(也是导致编译时错误的原因,是因为编译器无法找出要调用的方法,所以应该如何生成正确的可执行代码)
UnholySheep

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.