我正在寻找一些关于如何处理以下情况的建议:
假设我有一个类型的数组,并且在该数组中有各种类型的对象扩展所述类型。例如:我有一个超级Pet,我制作一个Pet数组,然后放入Dog,Cat和Fish类的各种对象并将它们放在这个数组中。现在,每种类型的宠物都有自己的领域和方法。
这是我的问题发挥作用的地方。我想循环遍历此数组并搜索特定对象并调用其中一个方法。建立我之前的例子,我想搜索一个名为“Benny”的狗。一旦找到它,我想打电话给Benny的getHairLength
方法。但是,如果我正在迭代我的各种宠物类型的集合,我不能打电话给Pet[index].getHairLength
,因为不是所有的宠物都有这种方法(只有狗做)。
任何提示?
答案 0 :(得分:0)
if(pet[index] instanceof Dog) {
((Dog)pet[index]).getHairLength();
}
答案 1 :(得分:0)
1)你绝对可以将“Pet”(超类)转换为“Dog”(子类)。是否应该是另一个问题,但你“可以”。
2)如果你得到一个ClassCastException ...那么你做错了什么。您正在保存错误的对象或错误的类型。我们需要查看要排除故障的代码。
3)一种解决方案是将“Pets”保存到列表中,然后使用if / else块:
Pet p = pets[i];
if (p instanceof Dog)
...
else if (p instanceof Cat)
...
4)另一个解决方案是将相同的对象保存到尽可能多的不同列表中:
List<Pet> pets = new ArrayList<Pet>();
List<Dog> dogs = new ArrayList<Dog>();
...
Dog fido = new Dog (...);
pets.add(fido);
dogs.add(fido);
这样,你可以:
a)更有效地搜索“狗”(你不必处理任何“猫”或“金鱼”)
b)你不必投任何东西
c)您仍然可以完全灵活地聚合“宠物”。