是否有任何具有不一致compareTo()和equals()的标准Java类?

我正在寻找所有标准的Java类,compareTo()可以返回0而equals()返回false:

Comparable comparable1 = ???;
Comparable comparable2 = ???;

assert comparable1.compareTo(comparable2) == 0;
assert !comparable1.equals(comparable2);

我知道只有一个:new BigDecimal(“1.0”)等于新的BigDecimal(“1”)使用compareTo(),但不等于使用equals()。有没有其他人?

我对所有这些类感兴趣,但只从公共Java API。我需要它为AssertJ的UnevenComparableAssert接口提供详尽的文档。

编辑:

感谢@ErikVesteraas,我设法重现额外的例子:

Calendar calendar1 = new GregorianCalendar(0, 0, 0);
Calendar calendar2 = new GregorianCalendar(0, 0, 0);
calendar2.setLenient(false);

Comparable comparable1 = calendar1;
Comparable comparable2 = calendar2;

assert comparable1.compareTo(comparable2) == 0; // compareTo compares along the timeline
assert !comparable1.equals(comparable2); // equals compares state, leniency is different
实际上似乎有一些例子,但有些没有很好地记录在代码或JavaDoc中。 This blog post by Stephen Colebourne给出了详细信息,但总的来说以下类与equals不一致:

> java.math.BigDecimal
> java.io.ObjectStreamField
> javax.management.ObjectName(无法再现一个例子)
> java.util.Calendar
> java.util.GregorianCalendar

例如:

ObjectStreamField a = new ObjectStreamField("foo", String.class);
ObjectStreamField b = new ObjectStreamField("foo", String.class);
a.equals(b); // false, checks object equality
a.compareTo(b); // 0

正如Olivier所指出的,Java 8还增加了java.time.zone.ZoneOffsetTransition

值得注意的是,java.time.OffsetTime通过添加额外的方法避免了不一致,isAfter,isBefore和isEqual用于进行时间线比较/等式检查。

http://stackoverflow.com/questions/30152202/are-there-any-standard-java-classes-with-inconsistent-compareto-and-equals

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:是否有任何具有不一致compareTo()和equals()的标准Java类?