Maison >Java >javaDidacticiel >Pourquoi ma méthode Java `compareTo` viole-t-elle le contrat général ?

Pourquoi ma méthode Java `compareTo` viole-t-elle le contrat général ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-15 02:13:17809parcourir

Why Does My Java `compareTo` Method Violate the General Contract?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn