Java超类变量和子类复制构造函数问题

时间:2015-11-20 11:46:19

标签: java inheritance subclass copy-constructor superclass

我知道在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。如果一直在阅读和搜索几个小时但似乎无法想出解决方案。有没有人知道解决这个问题的方法?感谢所有帮助。

2 个答案:

答案 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();

这里的好处是你不需要上课的条件。