J'essaye de remplacer la méthode d'égalité en Java. J'ai une classe People
qui a essentiellement 2 champs de données name
et age
. Maintenant, je veux remplacer la equals
méthode afin de pouvoir vérifier entre 2 objets People.
Mon code est le suivant
public boolean equals(People other){
boolean result;
if((other == null) || (getClass() != other.getClass())){
result = false;
} // end if
else{
People otherPeople = (People)other;
result = name.equals(other.name) && age.equals(other.age);
} // end else
return result;
} // end equals
Mais quand j'écris, age.equals(other.age)
cela me donne une erreur car la méthode égale ne peut comparer que la chaîne et l'âge est un entier.
Solution
J'ai utilisé l' ==
opérateur comme suggéré et mon problème est résolu.
java
overriding
equals
castor
la source
la source
Réponses:
Production:
la source
hash = 53 * hash
raison pour laquelle vous l'utilisez?getClass()
va poser des problèmes si la classe est sous-classée et est comparée à un objet de la super-classe.hashCode()
instanceof
opérateur ouisAssignableFrom
. Cela nécessitera une correspondance de type exacte, plutôt qu'une correspondance de sous-type. - Exigence symétrique. Aussi pour comparerString
ou d'autres types d'objets, vous pouvez utiliserObjects.equals(this.name,other.name)
.L'introduction d'une nouvelle signature de méthode qui modifie les types de paramètres s'appelle la surcharge :
Voici
People
différent deObject
.Lorsqu'une signature de méthode reste identique à celle de sa superclasse, elle est appelée overriding et l'
@Override
annotation permet de distinguer les deux au moment de la compilation:Sans voir la déclaration réelle de
age
, il est difficile de dire pourquoi l'erreur apparaît.la source
Je ne suis pas sûr des détails car vous n'avez pas publié l'intégralité du code, mais:
hashCode()
aussiequals
méthode devrait avoirObject
, pasPeople
comme type d'argument. Pour le moment, vous surchargez, et ne remplacez pas, la méthode equals, ce qui n'est probablement pas ce que vous voulez, d'autant plus que vous vérifiez son type plus tard.instanceof
pour vérifier qu'il s'agit d'un objet People, par exempleif (!(other instanceof People)) { result = false;}
equals
est utilisé pour tous les objets, mais pas pour les primitives. Je pense que vous voulez dire que l'âge est unint
(primitif), auquel cas il suffit d'utiliser==
. Notez qu'un entier (avec un 'I' majuscule) est un objet qui doit être comparé à des égaux.Voir Quels problèmes doivent être pris en compte lors de la substitution de equals et hashCode en Java? pour plus de détails.
la source
la source
Item 10: Obéir au contrat général en cas de dépassement des égaux
Chaque instance de la classe est intrinsèquement unique . Cela est vrai pour les classes telles que Thread qui représentent des entités actives plutôt que des valeurs. L'implémentation equals fournie par Object a exactement le bon comportement pour ces classes.
Il n'est pas nécessaire que la classe fournisse un test «d'égalité logique». Par exemple, java.util.regex.Pattern aurait pu remplacer equals pour vérifier si deux instances Pattern représentaient exactement la même expression régulière, mais les concepteurs ne pensaient pas que les clients auraient besoin ou voudraient de cette fonctionnalité. Dans ces circonstances, l'implémentation equals héritée d'Object est idéale.
Une superclasse a déjà remplacé égal à, et le comportement de la superclasse est approprié pour cette classe. Par exemple, la plupart des implémentations de Set héritent de leur implémentation equals de AbstractSet, des implémentations de List de AbstractList et des implémentations de Map de AbstractMap.
La classe est privée ou privée du package , et vous êtes certain que sa méthode equals ne sera jamais appelée. Si vous êtes extrêmement réticent au risque, vous pouvez remplacer la méthode equals pour vous assurer qu'elle n'est pas invoquée accidentellement:
La
equals
méthode implémente une relation d'équivalence. Il a ces propriétés:Réflexif: pour toute valeur de référence non nulle
x
,x.equals(x)
doit retourner true.Symétrique: pour toutes les valeurs de référence non nulles
x
ety
,x.equals(y)
doit retourner true si et seulement si y.equals (x) renvoie true.Transitif: Pour toutes les valeurs de référence non nulles
x
,y
,z
, si lesx.equals(y)
retourstrue
et lesy.equals(z)
retourstrue
, puisx.equals(z)
doit revenirtrue
.Cohérent: pour toutes les valeurs de référence non nulles
x
ety
, plusieurs invocations dex.equals(y)
doivent systématiquement renvoyertrue
ou renvoyer systématiquementfalse
, à condition qu'aucune information utilisée dans les comparaisons égales ne soit modifiée.Pour toute valeur de référence non nulle
x
,x.equals(null)
doit retournerfalse
.Voici une recette pour une méthode égale de haute qualité:
Utilisez l'
==
opérateur pour vérifier si l'argument est une référence à cet objet. Si tel est le cas, retournez true. Il ne s'agit que d'une optimisation des performances, mais qui en vaut la peine si la comparaison est potentiellement coûteuse.Utilisez l'
instanceof
opérateur pour vérifier si l'argument a le type correct. Sinon, retournez false. En règle générale, le type correct est la classe dans laquelle la méthode se produit. Parfois, il s'agit d'une interface implémentée par cette classe. Utilisez une interface si la classe implémente une interface qui affine le contrat égal pour permettre des comparaisons entre les classes qui implémentent l'interface. Les interfaces de collection telles que Set, List, Map et Map.Entry ont cette propriété.Convertissez l'argument dans le type correct. Étant donné que cette conversion a été précédée d'un test instanceof, son succès est garanti.
Pour chaque champ «significatif» de la classe, vérifiez si ce champ de l'argument correspond au champ correspondant de cet objet. Si tous ces tests réussissent, renvoyez true; sinon, retournez false. Si le type de l'étape 2 est une interface, vous devez accéder aux champs de l'argument via les méthodes d'interface; si le type est une classe, vous pourrez peut-être accéder directement aux champs, en fonction de leur accessibilité.
Pour les champs primitifs dont le type n'est pas
float
oudouble
, utilisez l'==
opérateur pour les comparaisons; pour les champs de référence d'objet, appelez laequals
méthode de manière récursive; pour lesfloat
champs, utilisez laFloat.compare(float, float)
méthode statique ; et pour lesdouble
champs, utilisezDouble.compare(double, double)
. Le traitement spécial du flotteur et double champs est rendue nécessaire par l'existence deFloat.NaN
,-0.0f
et les valeurs doubles analogues; Bien que vous puissiez comparerfloat
et desdouble
champs avec les méthodes statiquesFloat.equals
etDouble.equals
, cela impliquerait une mise en boîte automatique sur chaque comparaison, ce qui aurait des performances médiocres. Pour lesarray
champs, appliquez ces directives à chaque élément. Si chaque élément d'un champ de tableau est significatif, utilisez l'une desArrays.equals
méthodes.Certains champs de référence d'objet peuvent légitimement contenir
null
. Pour éviter la possibilité d'unNullPointerException
, vérifiez l'égalité de ces champs à l'aide de la méthode statiqueObjects.equals(Object, Object)
.la source
hashCode()
. A noter également, que depuis l' écriture java7equals()
ethashCode()
méthodes est devenu beaucoup plus facile à l'aideObjects.equals()
,Arrays.equals()
etObjects.hashCode()
,Arrays.hashCode()
.if (getClass() != obj.getClass()) ...
plutôt que d'utiliser l'opérateur instanceof. Cela nécessitera une correspondance de type exacte , plutôt qu'une correspondance de sous-type. - Exigence symétrique.Puisque je suppose que
age
c'est du typeint
:la source
NullPointerException
siname
estnull
.name
jamais denull
valeur ...Lorsque vous comparez des objets en Java, vous effectuez une vérification sémantique , comparant le type et l’état d’identification des objets à:
null
Règles:
a.equals(b) == b.equals(a)
equals()
cède toujourstrue
oufalse
, mais jamais unNullpointerException
,ClassCastException
ou tout autre jetableComparaison:
instanceof
pour la comparaison de types (qui ne fonctionne que tant qu'il n'y a pas de sous-classes et enfreint la règle de symétrie quandA extends B -> a instanceof b != b instanceof a)
.Pour votre
Person
classe:Classe d'utilité générique réutilisable:
Pour votre
Person
classe, en utilisant cette classe utilitaire:la source
si age est int, vous devez utiliser == s'il s'agit d'un objet Integer alors vous pouvez utiliser equals (). Vous devez également implémenter la méthode de hashcode si vous remplacez equals. Les détails du contrat sont disponibles dans le javadoc d'Object et également sur diverses pages Web.
la source
Voici la solution que j'ai récemment utilisée:
la source