多态场景下遍历集合时如何调用子类的growTruskawka方法
如何在遍历抽象类集合时调用子类特有的方法?
你遇到的是典型的抽象类集合遍历与子类方法调用的问题,这里给你两种实用的解决思路:
方法一:类型检查 + 强制转换
如果不想修改现有抽象类的结构,可以在遍历的时候先判断元素的实际类型,再强制转换后调用子类方法。
比如主类中的代码可以这么写:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Owoc> owocList = new ArrayList<>(); owocList.add(new Truskawka()); // 可以添加其他Owoc子类实例 owocList.add(new Owoc() { { setName("jablko"); setWeight(100); } }); // 遍历集合 for (Owoc owoc : owocList) { // 判断当前元素是否是Truskawka的实例 if (owoc instanceof Truskawka) { // 强制转换为Truskawka类型 Truskawka truskawka = (Truskawka) owoc; truskawka.growTruskawka(); } } } }
这种方法的特点:
- 优点:不需要修改现有抽象类和子类的结构,快速解决当前问题
- 缺点:如果后续新增多个Owoc子类,会出现大量
instanceof判断和强制转换,代码冗余且违反开闭原则
方法二:利用多态(推荐方案)
这是更符合面向对象设计思想的方案,通过在抽象类中定义抽象方法,让子类实现各自的逻辑,遍历的时候直接调用抽象方法即可。
第一步:修改抽象类Owoc,添加抽象方法
public abstract class Owoc { public Owoc(){}; private String name; private double weight; public String getName(){ return name; } public void setName(String newName){ this.name = newName; } public double getWeight(){ return weight; } public void setWeight(double newWeight){ this.weight = newWeight; } // 添加抽象的生长方法 public abstract void grow(); }
第二步:让子类Truskawka实现grow方法
public class Truskawka extends Owoc { public Truskawka(){ setName("truskawka"); setWeight(1); } @Override public void grow() { // 原来的growTruskawka逻辑移到这里 System.out.println(getName() + " is growing"); } }
第三步:遍历集合时直接调用grow方法
public class Main { public static void main(String[] args) { List<Owoc> owocList = new ArrayList<>(); owocList.add(new Truskawka()); // 新增其他子类时,只需要实现grow方法即可 owocList.add(new Owoc() { { setName("banan"); setWeight(150); } @Override public void grow() { System.out.println(getName() + " is growing fast!"); } }); // 遍历调用,多态会自动执行对应子类的实现 for (Owoc owoc : owocList) { owoc.grow(); } } }
这种方法的优势:
- 完全符合多态特性,代码简洁易维护
- 后续新增Owoc子类时,只需要实现
grow方法,不需要修改遍历逻辑,完美遵循开闭原则
内容的提问来源于stack exchange,提问作者Dawid
相关产品推荐
相关产品推荐

