According to the Java Comparable.compareTo(T o)
documentation:
It is strongly recommended, but not strictly required that (x.compareTo(y)==0) == (x.equals(y))
.
Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact.
The recommended language is "Note: this class has a natural ordering that is inconsistent with equals."
If this rule is violated, weird and unpredictable failures can occur.
For example, in Java 5 the PriorityQueue.remove()
method relied on compareTo()
, but since Java 6 it relies on equals()
.
public class Foo implements Comparable<Foo> { @Override public int compareTo(Foo foo) { /* ... */ } // Noncompliant as the equals(Object obj) method is not overridden }
public class Foo implements Comparable<Foo> { @Override public int compareTo(Foo foo) { /* ... */ } // Compliant @Override public boolean equals(Object obj) { /* ... */ } }