java - 在 instanceof 检查后无法调用具有类型的方法
问题描述
我有一份杂货清单,里面存放了一些食物和饮料。Grocery 是一个抽象类,Food 和 Beverage 都扩展了它。
我在 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)。
解决方案
正如azurefrog 所建议的,我在 Grocery 中编写了一个抽象的 saveToFile 方法:
public abstract void saveToFile();
然后我像这样重写了 saveListToFile:
public static void saveListToFile(ArrayList<Grocery> groceries) {
for(Grocery item: groceries)
item.saveToFile();
}
这种方式之所以有效,是因为它使用多态性并在每个项目的适当类中运行适当的方法。
谢谢!
推荐阅读
- javascript - Typescript的Javascript导入-导出默认对象
- python - Pandas:PeriodIndex 与年份开始锚定偏移
- php - WKHTMLTOPDF(knplabs - snappy)不显示页眉或页脚页面
- java - 如何将回调值放入主方法?
- python - 在 pandas/numpy 中运行应用函数时访问元素的 2D 索引?
- spring-boot - 带有 logback 的 Spring-boot 将一些系统日志打印到应用程序日志中
- c# - CLR 类库是否必须在 Win32 中运行?
- r - 使用带有 a 的 pmap 将不同的正则表达式应用于 tibble 中的不同变量?
- nativescript - 如何修复我的“找不到模块:“@angular/compiler”错误?
- python - 使用 requirements.txt 安装了模块,但在运行应用程序时找不到模块