SylvainL が言ったように、ここではジェネリックは正しい選択ではありません。これは単純な継承/インターフェースの問題のように見えます。
新しい getPet メソッド:
public Animal getPet(AnimalKingdom allAnimals, int id)
{
return allAnimals.getAnimalsManager().findAnimalById(id);
}
継承の使用:
class Animal { void Roar() { throw new Exception("This animal cannot roar!"); } };
class Tiger extends Animal { @Override void Roar() { ... }; ... };
使用法:
getPet(thisZoo, tigersId).Roar();
またはインターフェイスを使用する: (もう少し複雑ですが、おそらく一般的には優れています)
注: この場合、実際には Animal は必要ありません。Object を使用できます。
class Animal { ... }; // no Roar method
interface Roarer { void Roar(); };
class Tiger extends Animal implements Roarer { @Override void Roar() { ... }; ... };
注: 以下の使用方法のいずれかをメソッドに貼り付けて、最終的に次のようにすることができます。
roar(getPet(thisZoo, tigersId));
使用法: ( を削除できますがtry {} catch
、これは一般的にはお勧めできません)
try
{
((Roarer)getPet(thisZoo, tigersId)).Roar();
}
catch (ClassCastException e) { /* handle error */ };
代替使用法: (安全に回避するためtry {} catch
に、まだこれを試していませんが、うまくいくと思います)
Animal animal = getPet(thisZoo, tigersId);
if (Roarer.class.isAssignableFrom(animal.class))
((Roarer)animal).Roar();
else
// handle error