Heim >Java >javaLernprogramm >Warum verstößt meine Java-Methode „compareTo' gegen den Allgemeinen Vertrag?
Fehler: Javas CompareTo-Methode verstößt gegen den allgemeinen Vertrag
Der Fehler „Vergleichsmethode verletzt ihren allgemeinen Vertrag“ kann frustrierend sein. Trotz umfangreicher Forschung haben viele Entwickler Schwierigkeiten, dieses Problem zu lösen.
Dieser Fehler tritt auf, wenn die Methode „compareTo“, die zum Vergleichen von Objekten in Java verwendet wird, gegen die Anforderung der Transitivität verstößt. Transitivität schreibt vor, dass A größer als C sein muss, wenn A größer als B und B größer als C ist.
Im bereitgestellten Codeausschnitt wurde ein benutzerdefinierter Komparator für CollectionItems implementiert, der jedoch Fehler enthielt, die zu dem führten Verletzung der Transitivität.
Fehler 1:
if (card1.getRarity() < card2.getRarity()) { return 1; }
Hier, wenn card1.getRarity() ist größer als card2.getRarity(), der korrekte Rückgabewert sollte -1 sein, nicht 1.
Fehler 2:
if (card1.getId() == card2.getId()) { //... } return -1;
Wenn die IDs nicht gleich sind, sollte der korrekte Rückgabewert -1 sein, wenn card1.getId() kleiner als card2.getId() ist, oder 1, wenn card1.getId() ist größer.
Überarbeiteter Komparator:
Um diese Fehler zu beheben, ist hier eine modifizierte Version des Komparators, die sich an die Transitivität hält:
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!
Das obige ist der detaillierte Inhalt vonWarum verstößt meine Java-Methode „compareTo' gegen den Allgemeinen Vertrag?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!