You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历存储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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:17:38