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
Libérer: 2024-12-15 02:13:17
original
808 Les gens l'ont consulté

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;
}
Copier après la connexion

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;
Copier après la connexion

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!
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal