次のクラスがあるとしましょう。
- 動物
- ネコ
- 犬
- 牛
Animal は基本クラスで、cat、dog、cow はそれぞれサブクラスです。
があり、Set<Cat>
これらはそれぞれ同じ方法で使用されるため、それらを操作する汎用関数を作成することは理にかなっています。Set<Dog>
Set<Cow>
private boolean addObject(Animal toAdd, Animal defVal, Set<? extends Animal> vals)
これはうまく機能し、問題なくセットを自由に渡すことができます。
問題が発生します: パラメータ vals に Animal toAdd を追加できません。グーグルは、メソッドを読み取るように変更すると、次のことを明らかにします。
private boolean addObject(Animal toAdd, Animal defVal, Set<? super Animal> vals)
Animal をパラメーター vals に追加できるようになります。これは機能しますが、サブクラス化された猫、犬、牛のセットを渡すことができません。さらに調査したところ、起動する警告なしで、次のように動作することがわかりました。
private <T> boolean addObject(T toAdd, T defVal, Set<? super T> vals)
問題は、アニマルのすべてが持っているメソッド呼び出しを実行できる必要があることです。これは、単純なキャストを使用して簡単に回避できます。
((Animal)toAdd).getAnimalType()
この問題を回避して、一般的な機能を維持し、キャストを必要としない方法はありますか? この例の場合、私のセットを基本タイプの動物のすべてのセットにする以外に?