Java - 为什么没有基于返回类型的方法重载?

llm*_*llm 43 java programming-languages overloading return

我知道这是不可能的,但任何人都可以提供一个理论,为什么Java选择不支持这个?我问,因为我遇到了一个我觉得很高兴的情况.

Pét*_*rök 77

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

boolean doSomething() { ... }

int doSomething() { ... }

doSomething(); // which one to call???
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,Java语言禁止这样做,但JVM却没有.看我的答案...... (4认同)

Luk*_*der 32

关于这个问题的一个有趣的方面是Java语言仅禁止通过返回类型重载方法.但不是JVM:

请注意,类中可能有多个匹配方法,因为虽然Java语言禁止类声明具有相同签名但返回类型不同的多个方法,但Java虚拟机却没有.虚拟机中增加的灵活性可用于实现各种语言功能.例如,可以使用桥接方法实现协变返回; 桥接方法和被覆盖的方法将具有相同的签名但返回类型不同.

From:Class.getMethod(String,Class ...)


Jay*_*Jay 14

我想知道为什么他们也不支持这个.当然,如果忽略返回值,编译器将无法知道您想要的是什么.但这与传递空值时产生的模糊性相同.喜欢:

String doSomething(String s) { ... }
String doSomething(Integer s) { ... }
...
String out=doSomething(null);
Run Code Online (Sandbox Code Playgroud)

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

String out=doSomething((String)null);
Run Code Online (Sandbox Code Playgroud)

你可以通过返回类型重载:

String getSomething() { ... }
Integer getSomething() { ... }
...
Integer n=getSomething();
Run Code Online (Sandbox Code Playgroud)

可能会称之为第二个功能.

getSomething();
Run Code Online (Sandbox Code Playgroud)

会不明确(在这个例子中,可能没用,除非它有副作用,但这是另一个故事),所以你不得不说:

(String) getSomething();
Run Code Online (Sandbox Code Playgroud)

更现实的,也许:

if ((String) getSomething()==null) ...
Run Code Online (Sandbox Code Playgroud)

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

String getSomething() { ... };
Integer getSomething() { ... };
String getOtherthing() { ... };
...
if (getSomething().equals(getOtherthing())) ...
Run Code Online (Sandbox Code Playgroud)

编译器必须弄清楚String和Integer都有等于函数,因此在这一点上任何一个都是有效的.然后它必须注意到getOtherthing是一个String,并且Integer.equals(String)不太可能,因此作者想要的可能是String.equals(String).可行,但在那时我开始看到,在一般情况下,这可能是一个野兽.

然后假设我们添加:

Integer getOtherthing() { ... };
Run Code Online (Sandbox Code Playgroud)

现在编译器对IF语句做了什么?它可以使用两个函数的String版本,也可以使用Integer,但不能使用一个String和另一个的Integer.在那时,它必须坚持要一个演员告诉它,我猜.但复杂性确实失控.

如果编译器很难弄清楚你的意思,想象一下,对于那些无法像编译器那样快速查找所有函数签名的程序员来说会是什么样子.