オーバーロード メソッドの選択: 実数パラメータ型と宣言されたパラメータ型
Java プログラミングでは、オーバーロードされたメソッドにより、同じパラメータで複数のメソッドを定義できる柔軟性が得られます。名前は異なりますが、パラメータリストが異なります。メソッドが呼び出されるとき、コンパイラは、指定された引数リストに基づいて呼び出す適切なメソッドを決定します。
ただし、特定のシナリオでは、メソッドの選択では代わりにパラメータの実際の (実行時) 型が考慮されるのではないかと疑問に思うかもしれません。宣言された型の。次のコードを考えてみましょう:
interface Callee { void foo(Object o); void foo(String s); void foo(Integer i); } class CalleeImpl implements Callee { @Override public void foo(Object o) { System.out.println("foo(Object o)"); } @Override public void foo(String s) { System.out.println("foo(\"" + s + "\")"); } @Override public void foo(Integer i) { System.out.println("foo(" + i + ")"); } } public class Main { public static void main(String[] args) { 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); } }
予期せぬことに、このコードは 3 つの呼び出しすべてに対して「foo(Object o)」を出力します。直感に反して、メソッドの選択では実際のパラメーターの型 (整数、文字列、オブジェクト) は考慮されません。代わりに、呼び出し先インターフェイスで宣言されたパラメーターの型のみに依存します。
この動作は、明示的に次のように規定されている Java 言語仕様に由来しています。
When a method is invoked, the number of actual arguments and the compile-time types of the arguments are used, at compile time, to determine the signature of the method that will be invoked.
したがって、次の点に注意することが重要です。 Java では、呼び出される実際のメソッドが呼び出されるオブジェクトに基づいて実行時に決定される動的メソッド ディスパッチは、パラメータではなくオブジェクト自体にのみ適用されます。タイプ。
以上がJava メソッドのオーバーロードでは、実行時のパラメーターの型が考慮されますか、それともコンパイル時に宣言された型のみが考慮されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。