Maison >Java >javaDidacticiel >Pourquoi ma méthode Java `compareTo` viole-t-elle le contrat général ?
Erreur : la méthode compareTo de Java viole le contrat général
Rencontrer l'erreur « La méthode de comparaison viole son contrat général » peut être frustrant. Malgré des recherches approfondies, de nombreux développeurs ont du mal à résoudre ce problème.
Cette erreur se produit lorsque la méthode compareTo, utilisée pour comparer des objets en Java, viole l'exigence de transitivité. La transitivité dicte que si A est supérieur à B et B est supérieur à C, alors A doit être supérieur à C.
Dans l'extrait de code fourni, un comparateur personnalisé pour CollectionItems a été implémenté mais contenait des erreurs qui ont conduit à l'erreur violation de la transitivité.
Erreur 1 :
if (card1.getRarity() < card2.getRarity()) { return 1; }
Ici, si card1.getRarity() est supérieur à card2.getRarity(), la valeur de retour correcte doit être -1, et non 1.
Erreur 2 :
if (card1.getId() == card2.getId()) { //... } return -1;
Lorsque les identifiants ne sont pas égaux, la valeur de retour correcte doit être -1 si card1.getId() est plus petit que card2.getId(), ou 1 si card1.getId() est supérieur.
Comparateur révisé :
Pour résoudre ces erreurs, voici une version modifiée du comparateur qui adhère à la transitivité :
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!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!