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

在Java中使用不同的返回类型重载?,java,overloading,Java,Overloading,为什么仅仅通过更改返回类型不可能重载函数?这种情况会在未来的Java版本中发生变化吗 顺便说一下,在C++中,这是可能的吗?< p>你不能用java来做,而C++不能这样做。其基本原理是,仅返回值不足以让编译器确定要调用哪个函数: public int foo() {...} public float foo() {..} ... foo(); // which one? 原因是Java中的重载只允许用于具有不同签名的方法 返回类型不是方法签名的一部分,因此不能用于区分重载 请参阅Java教

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


顺便说一下,在C++中,这是可能的吗?

< p>你不能用java来做,而C++不能这样做。其基本原理是,仅返回值不足以让编译器确定要调用哪个函数:

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

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

原因是Java中的重载只允许用于具有不同签名的方法

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


请参阅Java教程。

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

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

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


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

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

}

不可能这样,只能通过参数的参数或数据类型超载

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

如果你知道函数的执行,那么你就会知道当我们调用函数时,定义部分会执行,最后我们需要返回语句,因此我们可以说返回在函数的整个定义之后,这就是为什么如果有两个或多个函数具有相同的名称、相同的参数类型和数量,那么在调用时编译器将如何知道要调用哪个函数,因为函数名称和参数是相同的。在第一次调用时,所有的焦点都集中在参数和函数名上,在函数定义完成后,最后处理return语句


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

重载方法与其他同名方法完全不同。重载不仅仅是名称重用。

我一直认为,如果我们执行int I=foo()或float f=foo()之类的操作,它就会知道是哪一个,但如果语句只是它不知道的函数,编译器就不会知道了。我知道了。谢谢。@nunos即使它是float f=foo(),编译器也无法计算出来,因为int和int都是float的有效输入。比较浮动f=7;(7是浮点还是int?@NomeN但是你的陈述表明func(int i)和func(float i)对于编译器来说是不可区分的-我们都知道这不是真的。真正的原因由Oded给出(见下一个答案)——这与方法的签名有关。顺便说一句,7绝对是整数,而7.0或7f是浮点;-)7.0不是
float
,而是
double
将是不明确的,这不一定是不允许它作为重载的原因。有些参数可能会导致歧义(例如
foo(null);
),但这并不会使重载本身无效。当我第一次看到这一点时,我感到困惑。感谢您解释为什么这是可能的!重载和重写是不同的。重载不(必然)涉及继承这个答案对Java新手来说可能听起来有误导性,因为它与重载无关,它是重写的-完全是另一回事。但是为什么返回类型不是签名H的一部分“仅仅因为”!我明白了。返回类型是方法签名的一部分。只要看看类的反汇编,它实际上不是@konmik——不是根据方法重载的规则。试试看。相同的方法名称,相同顺序的相同参数类型,不同的返回类型。不会编译。是的,因为返回类型不是签名的一部分。签名是-方法的名称+其参数的类型和顺序。阅读我在回答中提供的链接:“上面声明的方法的签名是:
calculateAnswer(double,int,double,double)
”。请注意,返回类型不包括@konmik.KNU的可能重复项,另一个答案的不同之处在于它提出的问题是一般性的,非特定语言的术语。另一个有趣的问题是,另一个问题的公认答案更进一步,指定Java JVM确实允许通过内部操作来完成它。这与公认的答案有何不同?(这也是编译时错误的原因,因为编译器无法确定要调用哪个方法,所以它应该如何生成正确的可执行代码)基本上,返回类型不考虑,只考虑参数,sad,true