次の例を考えてみてください(OOPブックでは一般的です)。
私にはAnimal
クラスがあり、それぞれにAnimal
多くの友達がいます。
好きなサブクラスDog
、Duck
、Mouse
のような特定の動作を追加などbark()
、quack()
など
ここに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();
型キャストを取り除くために戻り値の型にジェネリックスを使用できる方法はありますか?
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
以下に、使用されないパラメーターとしてメソッドに返される戻り値の型を含む初期コードをいくつか示します。
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
追加のパラメーターを使用せずに、実行時に戻りの型を理解する方法はありますinstanceof
か?または、少なくともダミーのインスタンスの代わりにそのタイプのクラスを渡すことによって。
ジェネリックはコンパイル時の型チェック用であると理解していますが、これに対する回避策はありますか?