>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. 카드 희귀도를 비교할 때, 카드1.getRarity()가 카드2.getRarity()보다 큰 경우 메서드는 -1을 반환하지 않습니다.
  2. 카드를 비교할 때 ID의 경우, 더 큰 값을 기준으로 -1 또는 1을 반환해야 하지만 ID가 동일하지 않으면 메서드는 -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으로 문의하세요.