正如 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