【问题标题】:Findbugs bug? "defines compareTo() and uses Object.equals()"Findbugs 错误? “定义 compareTo() 并使用 Object.equals()”
【发布时间】:2026-01-30 06:35:01
【问题描述】:

我收到以下 Findbugs 错误,类似于here 概述的错误:

这个类定义了一个 compareTo(...) 方法但是继承了它的 equals() 来自 java.lang.Object 的方法。

对于我班级中的这个方法:

Public class MyClass {

    public int getCost() { ... }

  @Override
    public final int compareTo(MyClass other) {
      return Integer.compare(this.getCost(), other.getCost());
    }
}

我认为这并不完全正确 - 正在使用 Integer.compare,根据 API:

如果 x == y,则值为 0;如果 x y

所以,为了规避错误,我尝试手动编写,得到了同样的错误:

public class MyClass {

  public int getCost() { ... }

  public final int compareTo(Myclass other) {
      if (this.finalCost < other.getFinalCost()) {
        return 1;
      } else if (this.getCost() > other.getCost() ) {
        return -1;
      } else {
        return 0;
      }
  }

现在,我什至根本没有定义或使用equals() 方法。这是 FindBugs 的错误吗?

此外,我读到的许多建议都说要实现自己的 equals 方法(我得到了),但也要实现自己的哈希……我不明白为什么。任何详细说明将不胜感激。

【问题讨论】:

  • 情况相似,但问题不同。我不一定像您的链接问题那样询问如何解决此问题(并且我也确实在原始答案中发布了该问题),但是如果 FindBugs 评估不正确。或者,如果它是正确的,那么当 Java API 似乎另有说明时,它是如何正确的。
  • FindBugs 评估是正确的,如链接问题的答案中所述。

标签: findbugs compareto


【解决方案1】:

compareTo 的实现在这个类中被覆盖,但是equals 的实现是继承自 Object 类,因此使用了不同的逻辑。 这可能会导致compareTo()返回0,而equals()返回false的情况;

【讨论】: