【问题标题】:Java class object not equal even they are equal [duplicate]Java类对象不相等,即使它们相等[重复]
【发布时间】:2021-04-19 22:46:49
【问题描述】:

嘿,我有两个 java 类对象,它们的键和值是相同的,但是当我检查 ob1.equals(obj2) 时它返回 false。

这里是代码:

   Category expected = new Category("01","lorem","custom");


  ResponseEntity<List<LinkedHashMap>> response = restTemplate.exchange("/api/categories", HttpMethod.GET,
                        null, new ParameterizedTypeReference<List<LinkedHashMap>>() {});

LinkedHashMap result = response.getBody().get(0); // which is same as expected object

//check if equals

 private boolean areEqual(LinkedHashMap result, Category expected) {
        String catId = (String) obj.get("category_id"); //is 01
        String name = (String) obj.get("category_name"); // is lorem
        String sec = (String) obj.get("section_name");   // is custom
        DefaultCategory temp = new Category(catId, name, sec);
        return temp.equals(expected);  //<--------- returning false, even they are equal
    }

api返回这个类别

 @GetMapping("categories")
    public ResponseEntity<List<Category>> getDefaultCategories() {
        List<Category> categories = new ArrayList();
        categories.add(new Category("01","lorem","custom"));
        return new ResponseEntity<>(categories, HttpStatus.OK);
    }

【问题讨论】:

    标签: java spring-boot integration-testing


    【解决方案1】:

    标准.equals(...) 检查两个对象是否相同。如果您想将两个对象与其字段进行比较。您可以覆盖equals 方法,如下所示。

    public class DefaultCategory {
        private String catId;
        private String name;
        private String sec;
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof DefaultCategory)) return false;
    
            DefaultCategory other = (DefaultCategory) o;
            if(!Objects.equals(other.catId, catId)) return false;
            if(!Objects.equals(other.name, name)) return false;
            if(!Objects.equals(other.sec, sec)) return false;
    
            return true;
        }
    }
    

    【讨论】:

      【解决方案2】:

      因为 expected 是子类而 temp 是超类,反之亦然。您正在比较两个不同的对象(类型)。将您临时转换为类别,您会没事的。或者覆盖你的 equals 以允许混合类型比较。

      【讨论】:

      • 嗨@ringadingding,你是对的。作者想将每个实例与其字段进行比较。我们可以比较没有类层次结构的对象。此外,许多实践检查对象类,但我们不必这样做。我觉得作者并没有重写equals方法来验证每个字段值,所以我重写了超类的equals
      猜你喜欢
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      • 2016-09-25
      • 2011-08-17
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多