Java 比较法违反其总合同-为什么?

Java 比较法违反其总合同-为什么?,java,android,Java,Android,我有用户列表的比较方法。我在这个列表中根据3个值上下移动用户:他们的类型,如果他们被选中为收藏夹,以及他们的姓名。我的方法如下所示: public int compare(ContactEntity lhs, ContactEntity rhs) { Integer lType = ContactUtils.getPresenceStatusType(lhs.getPresenceStatus(), presenceEntities).getType(); Integer rTy

我有用户列表的比较方法。我在这个列表中根据3个值上下移动用户:他们的类型,如果他们被选中为收藏夹,以及他们的姓名。我的方法如下所示:

public int compare(ContactEntity lhs, ContactEntity rhs) {
    Integer lType = ContactUtils.getPresenceStatusType(lhs.getPresenceStatus(), presenceEntities).getType();
    Integer rType = ContactUtils.getPresenceStatusType(rhs.getPresenceStatus(), presenceEntities).getType();

    Boolean lhsFavourite = ContactsHelper.isContactFavourite(lhs.getContactId(), favourites);
    Boolean rhsFavourite = ContactsHelper.isContactFavourite(rhs.getContactId(), favourites);

    int c;
    c = lType.compareTo(rType);
    if (c == 0)
        c = rhsFavourite.compareTo(lhsFavourite);
    if (c == 0)
        c = lhs.compareTo(rhs);
    return c;
}
在非常罕见的情况下,当一些用户有非常庞大的好友列表时,我在crashlytics error
中看到比较方法违反了它的一般约定。我的代码有什么问题


联系人实体比较方法:

@Override
public int compareTo(@NonNull ContactEntity another) {
    int compared = mFirstName.compareTo(another.getFirstName());
    if (compared == 0) {
        compared = mLastName.compareTo(another.getLastName());
    }
    return compared;
}

这回答了你的问题吗@德哈尔:我看了这个问题。但在我看来,我的代码比那个问题的答案更易读、更简单。这些答案都不足以解决这个问题。好吧。。。撤回接近投票。如果传递性是个问题,那么最有可能的问题就在这里:
c=lhs.compareTo(rhs)。因为在传递性方面,之前所做的整数和布尔值的比较很可能是正确的。你能给这个问题添加class
ContactEntity
的比较方法吗?我注意到收藏夹的检查有rhs.favorite.compareTo(lhs.favorite)。另外两个比较涉及lhs.comlareTo(rhs)这是否回答了您的问题@德哈尔:我看了这个问题。但在我看来,我的代码比那个问题的答案更易读、更简单。这些答案都不足以解决这个问题。好吧。。。撤回接近投票。如果传递性是个问题,那么最有可能的问题就在这里:
c=lhs.compareTo(rhs)。因为在传递性方面,之前所做的整数和布尔值的比较很可能是正确的。你能给这个问题添加class
ContactEntity
的比较方法吗?我注意到收藏夹的检查有rhs.favorite.compareTo(lhs.favorite)。另外两个比较涉及lhs.comlareTo(rhs)