Java 超类变量和子类拷贝构造函数问题

Java superclass variable and subclass copy constructor issue

我知道在Java中由于继承,一个superclass类型的变量可以保存一个subclass object的引用。例如,假设 ClassA 是 ClassB 的 superclass。您可以将 ClassA[] 的元素设置为引用 ClassB object。我 运行 在使用 subclass.

的复制构造函数时遇到了问题
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;
    }

在这种情况下,有三个class。物品、道具和收藏品。道具和收藏品是物品的子class。 masterInventory 是一个项目数组,存储收藏品和道具 objects。此方法的目的是在 masterInventory 数组中创建并 return 一个项目的副本。为了避免 .clone(),我为 Collectible 和 Props 创建了复制构造函数。但是我现在的方式显示了不兼容的类型错误,即无法将项目转换为收藏品或道具,即使存储在该元素中的 object 是收藏品或道具 object。如果一直在阅读和搜索数小时但似乎无法提出解决方案。有谁知道解决这个问题的方法?感谢所有帮助。

解决方法很简单——铸造:

if (masterInventory[iterator] instanceof Collectible) {
    itemToReturn = new Collectible((Collectible) masterInventory[iterator]); 
}
if (masterInventory[iterator] instanceof Props) {
    itemToReturn = new Props((Props) masterInventory[iterator]); 
}

您可以向项目 class 添加一个抽象方法 Item getCopy(),在 Props 和 Collectible 中实现它,并在 de while 循环中调用它:

itemToReturn = masterInventory[iterator].getCopy();

这里的好处是您不需要 class 上的条件。