メソッドのオーバーロードでメソッドの戻り型が考慮されないのはなぜですか?誰かが、コンパイラがオーバーロードされたメソッドをチェックする方法を説明できますか?
2 に答える
メソッドのオーバーロードでメソッドの戻り型が考慮されないのはなぜですか?
主な理由は、これを考慮した場合、戻り値が何かに割り当てられていないと、多くの関数呼び出しがあいまいになるためです。たとえば、ここで呼び出されている関数呼び出しはどれですか?
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は2つの例です。あなたの言語がこれを許可している場合、これをサポートするために必要なのは、メソッド解決プロセスのもう1つのステップであることがわかります。コンパイラが1つのメソッドまたは別のメソッドを選択するための明白な方法を用意するだけです。上記の例では、おそらく優先度を定義します(たとえば、最初に定義されたメソッドが勝つメソッドであるため、x()
呼び出しによって呼び出されますString x()
)。
もう1つの注意点は、JVMでは、シグネチャがリターンタイプのみが異なる2つのメソッドが存在することを許可していることです。(これが、Scalaやこれをサポートする他のJVM言語がそれを行う方法です。
誰かが、コンパイラがオーバーロードされたメソッドをチェックする方法を説明できますか?
Java言語仕様のセクション8.4.9には、決定的な(しかし非常に技術的な)回答が含まれています:http: //java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.9