Java – 为什么没有返回types的方法重载?

我知道这是不可能的,但任何人都可以提供一个理论,为什么Javaselect不支持这个? 我在问,因为我刚刚遇到了一个我认为会很高兴的情况。

因为不需要在Java中捕获方法的返回值,在这种情况下,编译器无法决定使用哪个超载。 例如

boolean doSomething() { ... } int doSomething() { ... } doSomething(); // which one to call??? 

关于这个问题的一个有趣的方面是,Java语言只能通过返回types禁止重载方法。 但不是JVM:

请注意,在类中可能有多个匹配方法,因为尽pipeJava语言禁止类声明具有相同签名但返回types不同的多个方法,但Java虚拟机不会。 虚拟机中增加的灵活性可用于实现各种语言function。 例如,协变回报可以用桥接方法来实现; 桥接方法和被覆盖的方法将具有相同的签名但不同的返回types。

From: Class.getMethod(String,Class …)

我想你可能会在下面的链接find解决scheme。

函数通过返回types重载?

我想知道他们为什么不支持这一点。 当然,如果你忽略了返回值,编译器将无法知道你想要什么。 但这与传递空值时产生的模糊性是一样的。 喜欢:

 String doSomething(String s) { ... } String doSomething(Integer s) { ... } ... String out=doSomething(null); 

在这种情况下,编译器只是抱怨调用是不明确的,你必须通过投射null来解决它,如:

 String out=doSomething((String)null); 

通过返回types重载可以做同样的事情:

 String getSomething() { ... } Integer getSomething() { ... } ... Integer n=getSomething(); 

大概会叫第二个function。

 getSomething(); 

会是模棱两可的(在这个例子中,可能是无用的,除非它有副作用,但这是另一回事),所以你不得不说:

 (String) getSomething(); 

更现实一点,也许:

 if ((String) getSomething()==null) ... 

但这是一个简单的例子。 我可以看到一个编译器 – 编写者不想支持这个,因为除了一个简单的赋值之外,它可能变得非常复杂。 例如,考虑:

 String getSomething() { ... }; Integer getSomething() { ... }; String getOtherthing() { ... }; ... if (getSomething().equals(getOtherthing())) ... 

编译器必须弄清楚,String和Integer都有相等的函数,所以任何一个在那个时候都是有效的。 然后它将不得不注意,getOtherthing是一个string,Integer.equals(string)是不太可能的,所以可能是作者想要的是String.equals(String)。 可以的,但是在那个时候,我开始看到,在一般情况下,这可能是一个野兽。

然后,假设我们添加:

 Integer getOtherthing() { ... }; 

现在编译器用这个IF语句做什么? 它可以使用这两个函数的string版本,或整数,但不是一个string和另一个的整数。 在这一点上,我会坚持要一个演员来告诉它。 但是复杂性实际上已经失控。

如果编译器很难弄清楚你的真正含义,想象一下,另一个程序员不能像编译器那样快速地查找所有函数签名,这会是什么样的情况。

这是因为你可以自由地忽略返回值。

虽然这在理论上是可能的,但是它并没有在Java中使用,这与在C ++中没有使用它的原因是一样的。 即已经发现,基于返回types的重载通常对开发者来说更​​加混乱,与实现它的成本相比,好处是边际的,并且在返回types没有被分配给值。 由于这些原因,不支持基于返回types的重载。

我认为其中一个原因是,在大多数情况下,只有在函数执行之后,才能确定函数的返回types,而不是在此过程之前。 因此,它不能帮助您根据不同的函数返回types来决定重载哪个函数。

仅在返回types的基础上重载函数是编译器区分这些调用的混淆,因为在调用时您没有给出返回types,就像在参数的情况下一样,所以您只给出参数列表和此参数列表是编译器区分函数调用的唯一方法,并且在函数完成时接收返回值,这就是为什么返回types不参与函数的签名

因为Java可以将返回types值强制转换为目标variables,所以它不知道该存储函数返回值的variablestypes。