无法在检查实例后调用具有类型的方法

问题描述 投票:-2回答:2

我有一些杂货清单,其中存放了一些食品和饮料。杂货店是抽象类,食品和饮料都对其进行了扩展。

我在Grocery内部创建了一个静态方法,将杂货列表保存在文件中。此方法将扫描整个列表,并且对于每个元素,如果元素是食物,则应在Food类中调用saveToFile方法,如果元素是饮料,则应在Beverage类中调用saveToFile方法。

public static void saveListToFile(ArrayList<Grocery> groceries) {
    for(int i = 0; i < groceries.size(); i++) {
        if(groceries.get(i) instanceof Food) {
            Food.saveToFile(groceries.get(i));
        }
        else
            Beverage.saveToFile(groceries.get(i));
    }
}

这不会编译。相反,我收到以下错误:Food类型的方法saveToFile()不适用于参数(Grocery)。

java
2个回答
2
投票

[检查类型后立即尝试投射,例如:

if(groceries.get(i) instanceof Food) {
   Food.saveToFile((Food)groceries.get(i));
}
else
   Beverage.saveToFile((Beverage)groceries.get(i));

0
投票

[azurefrog建议,我在Grocery内编写了一个抽象的saveToFile方法:

public abstract void saveToFile();

然后我像这样重写了saveListToFile:

public static void saveListToFile(ArrayList<Grocery> groceries) {
    for(Grocery item: groceries)
        item.saveToFile();
}

这种方式有效,因为它使用了多态性,并且在每个项目的适当类内运行了适当的方法。

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.