为什么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
相关产品推荐
相关产品推荐

