ホームページ >Java >&#&チュートリアル >ジェネリックはどうやって動物の友人の検索における型キャストを排除できるのでしょうか?

ジェネリックはどうやって動物の友人の検索における型キャストを排除できるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-11 14:21:17376ブラウズ

How Can Generics Eliminate Type Casting in Animal Friend Retrieval?

ジェネリック メソッドの戻り値の型で型キャストを削除する方法

古典的な OOP シナリオを考えてみましょう: Dog、Duck などのさまざまなサブクラスを持つ Animal クラス、マウス、それぞれに独自の動作があります。各動物は友達のコレクションを持つことができ、相互に対話することができます。

public class Animal {
    private Map<String, Animal> friends = new HashMap<>();

    public void addFriend(String name, Animal animal) {
        friends.put(name, animal);
    }

    public Animal callFriend(String name) {
        return friends.get(name);
    }
}

ただし、次のコード スニペットに示すように、友達の特定の行動を取得するには型キャストが必要です。

Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());

((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();

この型キャストを排除するには、ジェネリクスを使用して callFriend メソッドの戻り値の型を作成できます

public <T extends Animal> T callFriend(String name, T unusedTypeObj) {
    return (T) friends.get(name);
}

このアプローチでは戻り値の型を未使用のパラメーターとしてメソッドに伝えますが、より洗練された解決策は、実行時に戻り値の型を決定することです。

これを実現する 1 つの方法これは、callFriend メソッドを変更することによって行われます:

public <T extends Animal> T callFriend(String name, Class<T> type) {
    return type.cast(friends.get(name));
}

これにより、メソッドを次のように呼び出すことができます。

jerry.callFriend("spike", Dog.class).bark();
jerry.callFriend("quacker", Duck.class).quack();

このメソッドにはコンパイラ警告がないという利点がありますが、本質的にはジェネリック以前のキャストの更新バージョンであり、安全性は強化されません。

以上がジェネリックはどうやって動物の友人の検索における型キャストを排除できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。