我知道在Java中由于继承,超类型变量可以保存对子类对象的引用。例如,ClassA是ClassB的超类。您可以设置ClassA []的元素以引用ClassB对象。在使用子类的复制构造函数时,我遇到了一个问题。
public Items copyFromMasterInventory(String str){
Items itemToReturn = null;
int length = masterInventory.length;
int iterator = 0;
while (iterator < length){
String name = masterInventory[iterator].getName();
if (name.equals(str)){
if (name.getClass().equals(Collectible.class)){
itemToReturn = new Collectible(masterInventory[iterator]);
}
if (name.getClass().equals(Props.class)){
itemToReturn = new Props(masterInventory[iterator]);
}
}
}
return itemToReturn;
}
在这种情况下,有三个类。物品,道具和收藏品。 Props和Collectible是Items的子类。 masterInventory是一个存储Collectible和Props对象的Items数组。此方法的目的是在masterInventory数组中创建并返回项的副本。为了避免.clone()
,我为Collectible和Props创建了复制构造函数。但我现在拥有的方式显示了一个不兼容的类型错误,即使存储在该元素中的对象是Collectible或Props对象,也无法将Items转换为Collectible或Props。如果一直在阅读和搜索几个小时但似乎无法想出解决方案。有没有人知道解决这个问题的方法?感谢所有帮助。
答案 0 :(得分:1)
解决方案很简单 - 铸造:
if (masterInventory[iterator] instanceof Collectible) {
itemToReturn = new Collectible((Collectible) masterInventory[iterator]);
}
if (masterInventory[iterator] instanceof Props) {
itemToReturn = new Props((Props) masterInventory[iterator]);
}
答案 1 :(得分:1)
您可以向Item类添加一个抽象方法Item getCopy()
,在Props和Collectible中实现它,并在de while循环中调用它:
itemToReturn = masterInventory[iterator].getCopy();
这里的好处是你不需要上课的条件。