ジェネリック メソッドの戻り値の型で型キャストを削除する方法
古典的な 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 サイトの他の関連記事を参照してください。