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

为什么Java校验重复对象方法在类不匹配时仍返回true

问题诊断

你的校验逻辑遗漏了「待插入对象与已存在对象类型一致」的判断条件:现有代码仅校验了已存储对象y的类型是Serie或Filme,只要二者名称、分类匹配,无论待插入的programa是哪个子类,都会直接判定为重复。
比如你示例中已存在Serie类型的对象,插入同名称同分类的Filme对象时,第一个分支判断到已存储的y是Serie,且名称、分类匹配,就直接返回true,完全不会校验待插入对象是不是Serie类型,这就是问题的核心原因。

修复方案

推荐直接比较两个对象的运行时类是否一致,无需区分子类分支,后续新增Programa子类也无需修改代码:

public boolean seExiste(Programa programa) {
    for (Programa y : this.programa) {
        // 类型、名称、分类三者完全一致才判定为重复
        if (y.getClass() == programa.getClass()
                && y.getNome().equals(programa.getNome())
                && y.getCategoria().equals(programa.getCategoria())) {
            return true;
        }
    }
    return false;
}

如果需要保留原有分支判断的写法,补充待插入对象的类型校验即可:

public boolean seExiste(Programa programa) {
    for (Programa y : this.programa) {
        if (Serie.class.isInstance(y) && Serie.class.isInstance(programa)
                && y.getNome().equals(programa.nome)
                && y.getCategoria().equals(programa.categoria)) {
            return true;
        } 
        if (Filme.class.isInstance(y) && Filme.class.isInstance(programa)
                && y.getNome().equals(programa.nome)
                && y.getCategoria().equals(programa.categoria)) {
            return true;
        }                   
    }
    return false;
}

注意:如果Programa类的nome、categoria是私有属性,需要统一用getter方法取值,不要直接访问实例属性,避免编译报错。

内容的提问来源于stack exchange,提问作者Guilherme Gusman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:45:03