为什么在方法重载时不考虑方法的返回类型? 有人可以解释,编译器如何检查重载方法?
答案 0 :(得分:9)
为什么在方法重载时不考虑方法的返回类型?
主要原因是,如果你做了考虑这一点,如果没有为某些东西分配返回值,很多函数调用就会变得模糊不清。例如,这里调用了哪个函数调用?
public String x() { ... }
public int x() { ... }
// ...
x(); // <-- Which one did you mean? It's impossible to tell if you
// allow return types to be part of method overloads.
还有其他理由不想这样做。也就是说,许多语言做允许他们的签名仅在返回类型上有所不同; Haskell和Perl是两个例子。如果您的语言确实允许这样做,那么不难发现您需要支持的只是方法解析过程中的又一步:只需让编译器选择一种方法或另一种方法。在上面的例子中,也许我们会定义一个优先级(例如,定义的第一个方法就是获胜的方法,因此我们的x()
调用会调用String x()
)。
另一点需要注意的是,JVM 允许两种方法,其签名仅在返回类型上存在。 (这就是Scala和其他支持它的JVM语言的做法。
答案 1 :(得分:2)
有人可以解释,编译器如何检查重载方法?
Java语言规范,第8.4.9节,将包含确定的(但非常技术性的)答案: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.9