Java 오류: "비교 방법이 일반 계약을 위반합니다"
컬렉션을 정렬할 때 Java는 비교 방법을 사용하여 객체 순서를 설정합니다. 그러나 이 방법은 객체 A가 B보다 크고 B가 C보다 크면 A가 C보다 커야 한다는 전이성 원칙을 준수해야 합니다. 특정 상황에서는 이 계약을 위반하여 " 비교 방법이 일반 계약을 위반합니다." 오류.
예
객체를 정렬하기 위한 다음 사용자 지정 비교기를 고려하세요. 특정 기준에 따라. 그러나 논리적 불일치로 인해 다음과 같은 전이성 규칙을 위반합니다.
@Override public int compareTo(Object o) { ... if (card1.getRarity() < card2.getRarity()) { return 1; } ... if (card1.getSet() > card2.getSet()) { return -1; } ... }
전이성 문제
위 예에서 카드1.getRarity()가 결정적인 경우 인수이고 카드1.getRarity()가 카드2.getRarity()보다 작으면 비교기는 올바르게 1을 반환합니다. 그러나 Card2.getSet()이 결정 요인이고, Card2.getSet()가 Card1.getSet()보다 작으면 비교기가 -1을 잘못 반환합니다. 이로 인해 비전이적 상황이 발생합니다.
올바른 솔루션
전환성을 보장하려면 비교기는 다음 논리를 준수해야 합니다.
if (card1.getRarity() < card2.getRarity()) { return 1; } if (card1.getRarity() > card2.getRarity()) { return -1; } ...
요약하자면, "비교 방법이 일반 계약을 위반합니다" 오류를 방지하려면 비교 방법이 전이성 원칙을 준수하는지 확인하세요. 이 규칙은 객체 A가 B보다 크고 B가 C보다 큰 경우 A가 C보다 커야 함을 나타냅니다. 전이성을 보장함으로써 일관되고 올바른 정렬 동작을 보장합니다.
위 내용은 내 Java 비교기에서 '비교 방법이 일반 계약을 위반합니다' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!