ホームページ > Java > &#&チュートリアル > Java メソッドのオーバーロードは実際のパラメータ型と宣言された型をどのように処理しますか?

Java メソッドのオーバーロードは実際のパラメータ型と宣言された型をどのように処理しますか?

Mary-Kate Olsen
リリース: 2024-12-16 03:26:09
オリジナル
544 人が閲覧しました

How Does Java Method Overloading Handle Real Parameter Types vs. Declared Types?

オーバーロードされたメソッドの呼び出し: 実際のパラメーターの型の優先順位付け

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート