如何遍历存储ProductionDate接口不同实现类对象的ArrayList并查找特定类?代码无输出问题排查
问题分析与修复方案
兄弟,我一眼就看穿你代码为啥没输出了,主要是两个关键问题:
1. 完全错误的类型判断逻辑
你写的if(storage.getClass() == c)完全搞错了比对对象!storage是ArrayList的实例,它的Class是ArrayList.class,而你传入的c应该是ProductionDate的某个实现类(比如ConcreteProductionDate.class),这俩根本不可能相等,导致整个if代码块直接跳过,自然啥都不会输出。
2. 多余的冗余类型检查
d instanceof ProductionDate这个判断纯属画蛇添足——因为你的storage泛型是ArrayList<ProductionDate>,里面的元素必然是ProductionDate或它的子类,这个检查一点用都没有,反而增加冗余代码。
修复后的代码
根据你是否需要精确匹配类(不包含子类)还是允许匹配子类,给你两种方案:
方案一:精确匹配目标类(仅找完全符合该类的对象)
ArrayList<ProductionDate> storage; public void search(Class<?> c, int itemCount){ // 先确保storage不为空,避免空指针异常 if(storage == null) { System.out.println("存储列表未初始化"); return; } for(ProductionDate d : storage){ // 精确匹配元素的类与目标类 if(c.equals(d.getClass()) && d.getItemCount() >= itemCount){ System.out.println(d); } } }
方案二:允许匹配目标类及其子类
如果你的ProductionDate有子类,且想把子类对象也纳入查找范围,就用Class.isInstance()方法:
ArrayList<ProductionDate> storage; public void search(Class<?> c, int itemCount){ if(storage == null) { System.out.println("存储列表未初始化"); return; } for(ProductionDate d : storage){ // 检查元素是否是目标类或其子类的实例 if(c.isInstance(d) && d.getItemCount() >= itemCount){ System.out.println(d); } } }
额外提醒
别忘了初始化你的storage列表!比如在类的构造方法里加一句:
public YourClassName() { storage = new ArrayList<>(); }
不然调用search方法时会抛出NullPointerException,同样啥都输出不了。
内容的提问来源于stack exchange,提问作者Tanguat
相关产品推荐
相关产品推荐

