为什么Java方法重载中没有考虑返回类型?

时间:2010-03-21 06:01:54

标签: c# c++ inheritance programming-languages lang

为什么在方法重载时不考虑方法的返回类型? 有人可以解释,编译器如何检查重载方法?

2 个答案:

答案 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