首頁 >Java >java教程 >Java 比較器錯誤:如何修復「比較方法違反其一般契約」?

Java 比較器錯誤:如何修復「比較方法違反其一般契約」?

Patricia Arquette
Patricia Arquette原創
2024-12-14 10:07:12355瀏覽

Java Comparator Error: How to Fix

Java 錯誤:揭示違反比較方法的一般契約

定義比較器時會出現「比較方法違反其一般契約」錯誤Java未能遵守傳遞性的基本原則。此原則規定,如果物件 A 大於物件 B,且物件 B 大於物件 C,則 A 也必須大於 C。

要解決此錯誤,至關重要的是確保定義的比較器嚴格遵循此規則。在提供的範例中,問題出在compareTo() 方法中。幾個明顯的差異:

  1. 比較卡片稀有度時,當card1.getRarity()大於card2.getRarity()時,此方法不會回傳-1。
  2. 比較卡牌時ID,如果ID 不相等,該方法將返回-1,即使它應該根據較大者返回-1 或1 ID.

為了糾正這些錯誤,提出了比較器的修訂版本:

public int compareTo(Object o) {
    if (this == o) {
        return 0;
    }

    CollectionItem item = (CollectionItem) o;

    Card card1 = CardCache.getInstance().getCard(cardId);
    Card card2 = CardCache.getInstance().getCard(item.getCardId());

    if (card1.getSet() > card2.getSet()) {
        return 1;
    }
    if (card1.getSet() < card2.getSet()) {
        return -1;
    }
    if (card1.getRarity() < card2.getRarity()) {
        return 1;
    }
    if (card1.getRarity() > card2.getRarity()) {
        return -1;
    }
    if (card1.getId() > card2.getId()) {
        return 1;
    }
    if (card1.getId() < card2.getId()) {
        return -1;
    }
    return cardType - item.getCardType();  //watch out for overflow!
}

此更新的比較器確保比較方法遵守傳遞性規則。透過解決這些不一致問題,「比較方法違反其一般契約」錯誤將得到解決。

以上是Java 比較器錯誤:如何修復「比較方法違反其一般契約」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn