Java 无法在instanceof检查后调用类型为的方法

Java 无法在instanceof检查后调用类型为的方法,java,Java,我有一份食品杂货清单,里面有一些食品和饮料。食品杂货是一个抽象的类,食品和饮料都扩展了它 我在杂货店内创建了一个静态方法,将杂货清单保存在一个文件中。此方法扫描整个列表,对于其每个元素,如果元素是食品,则应在食品类内调用saveToFile方法;如果元素是饮料,则应在饮料类内调用saveToFile方法 public static void saveListToFile(ArrayList<Grocery> groceries) { for(int i = 0; i <

我有一份食品杂货清单,里面有一些食品和饮料。食品杂货是一个抽象的类,食品和饮料都扩展了它

我在杂货店内创建了一个静态方法,将杂货清单保存在一个文件中。此方法扫描整个列表,对于其每个元素,如果元素是食品,则应在食品类内调用saveToFile方法;如果元素是饮料,则应在饮料类内调用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));
    }
}
公共静态无效保存列表文件(ArrayList杂货店){
对于(int i=0;i

这是不可编译的。相反,我得到了以下错误:Food类型中的saveToFile()方法不适用于参数(screery)。

检查其类型后立即尝试强制转换它,例如:

if (groceries.get(i) instanceof Food) {
   Food.saveToFile((Food)groceries.get(i));
}
else
   Beverage.saveToFile((Beverage)groceries.get(i));
根据建议,我在杂货店内编写了一个抽象的saveToFile方法:

public abstract void saveToFile();
然后我重写了saveListToFile,如下所示:

public static void saveListToFile(ArrayList<Grocery> groceries) {
    for(Grocery item: groceries)
        item.saveToFile();
}
公共静态无效保存列表文件(ArrayList杂货店){
用于(杂货项目:杂货)
item.saveToFile();
}
这样做是因为它使用多态性,并在每个项的适当类中运行适当的方法


谢谢

使用instanceof的代码部分正确地执行了您想要的操作(即使这是一种不好的做法)

如果您的代码未编译时出现错误“Food类型中的方法saveToFile()不适用于参数(杂货店)”,这意味着您的方法saveToFile接受参数Food或饮料,而不是杂货店。您需要在应用该方法之前强制转换该项。(如果我的假设是正确的,那么这里缺少的食品和饮料类的内容)

公共静态无效保存列表文件(ArrayList杂货店){
对于(int i=0;i

我不知道您的确切需求,但我认为您可以使用继承设计一个更好的解决方案。saveToFile不必是静态的。您可以在Food and Beverage中有两个不同的实现,例如,两个实现中的每个实现都可以使用另一个类的静态功能提交在特定文件中写入

您想做什么?您面临的问题是什么?上面的代码几乎不提供任何上下文
方法,为什么不直接调用它呢?多态性的关键在于底层对象知道它自己的类型,并将调用正确的实现。好吧,我想我已经在我写的描述中很好地解释了我要做的事情。这是我得到的错误:方法saveToFile()在类型中,食品不适用于参数(杂货店)。可能是您必须将
杂货店.get(i)
的结果强制转换为
食品
饮料
食品.saveToFile((食品)杂货店.get(i))
。不幸的是,您没有发布编译器的错误消息或
食品.saveToFile
/
饮料.saveToFile
@stoneburner:我确实用错误消息更新了您的问题(这对回答问题的人有很大帮助)。我还删除了“我是一个傻瓜”部分-每个人都必须从某个地方开始,其他有相同问题的人会发现你的问题更容易。如果你在教室里学习,很可能在手动
instanceof
检查后显示通过多态性的实现,以证明多形性而不是手动的有用性检查。
public static void saveListToFile(ArrayList<Grocery> groceries) {
for(int i = 0; i < groceries.size(); i++) {
    if(groceries.get(i) instanceof Food) {
        Food.saveToFile((Food)groceries.get(i));
    }
    else
        Beverage.saveToFile((Beverage)groceries.get(i));
  }
}