メソッドのオーバーロードとパラメーターの型の決定
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);
この例では、 i が Integer オブジェクトであっても、callee.foo(i) を呼び出すと foo(Object o) メソッドが呼び出されます。これは、そのメソッドの宣言されたパラメータの型が Object であるためです。同様に、callee.foo(s) と callee.foo(o) の呼び出しは、それぞれ foo(String s) と foo(Object o) メソッドを呼び出します。
メソッドの選択は実際のパラメータを考慮できますか?型?
Java 言語仕様では、メソッド選択プロセスでは引数のコンパイル時の型だけが考慮され、考慮されないと明示的に述べられています。実際のランタイムタイプ。したがって、質問で指定されたコードを変更して、パラメーターの実際のランタイム型に基づいてメソッドが呼び出される望ましい動作を実現することはできません。
以上がJava メソッドのオーバーロードでは、メソッド選択の実行時パラメーターの型が考慮されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。