オーバーロードされたメソッドの呼び出し: 実際のパラメーターの型の優先順位付け
Java のメソッドのオーバーロード メカニズムは、宣言されたパラメーターの型に基づいて最も適切な実装を選択します。ただし、よくある誤解は、オーバーロードの解決中に実際の型も考慮されるということです。
課題
次のコード スニペットを考えてみましょう:
interface Callee { public void foo(Object o); public void foo(String s); public void foo(Integer i); } class CalleeImpl implements Callee { public void foo(Object o) { logger.debug("foo(Object o)"); } public void foo(String s) { logger.debug("foo(\"" + s + "\")"); } public void foo(Integer i) { logger.debug("foo(" + i + ")"); } } Callee callee = new CalleeImpl(); Object i = new Integer(12); Object s = "foobar"; Object o = new Object(); callee.foo(i); callee.foo(s); callee.foo(o);
実行時に、このコードは実際のパラメータに基づいて異なる実装を選択するのではなく、予期せず「foo(Object o)」を 3 回出力します。 types.
根本原因
Java では、メソッド呼び出しは、メソッドが呼び出されるオブジェクトに対して動的にディスパッチされますが、パラメータ型に対しては動的にディスパッチされません。 Java 言語仕様では、「引数のコンパイル時の型」によって選択されたメソッド シグネチャが決定されると明示的に記載されています。
したがって、パラメーター宣言は、パラメーターの割り当て中に発生する可能性のある型変換や昇格をオーバーライドします。その結果、Object は 3 つのパラメーターすべての宣言された型であるため、提供されたコード内の 3 つの呼び出しはすべて「foo(Object o)」メソッドに解決されます。
Resolution
この問題を解決し、オーバーロード解決において実パラメータ型を優先するには、次の戦略を検討してください:
以上がJava メソッドのオーバーロードは実際のパラメータ型と宣言された型をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。