Disons que j'ai une classe A et que B, C, D sont dérivés de A.
Si je veux savoir quel est le type d'objet référencé, je peux déclarer:
// pseudo-code
if(obj instanceof B)
< is B>
else if(obj instanceof C)
< is C>
else
<is D>
Ceci parce que je suis sûr que les classes dérivées de A ne sont que B, C et D.
Mais si je veux juste vérifier que deux références pointent vers le même type d’objet?
Donc quelque chose comme:
if(obj1 instanceof obj2)
<do something>
Mais bien sûr, la syntaxe est fausse.Comment vérifier cela sans mille si-sinon?
Tu veux dire quelque chose comme
obj1.getClass().equals(obj2.getClass())
Cela devrait renvoyer la valeur true uniquement si obj1
et obj2
appartiennent à la même classe spécifique.
Mais cela ne fonctionnera pas si vous comparez A
avec B extends A
. Si vous voulez une égalité renvoyant la valeur true, même si l'un est un sous-type d'un autre, vous devrez écrire une fonction de comparaison plus puissante. Je pense que vous pouvez le faire en bouclant avec getSuperClass()
pour remonter l’arborescence.
Je pense qu'une solution simple peut aussi être de faire A.getClass().isAssignableFrom(B.getClass())
, en supposant que B extends A
.
Vous pourriez faire
if (obj1.getClass() == obj2.getClass()) { ... }
Quelque chose comme ça:
if(classA.getClass().getName().equals(classB.getClass().getName()))
<do something>
Puisque B, C et D sont des sous-classes de A et que vous voulez faire quelque chose avec ces classes, je n’utiliserais pas l’opérateur instanceOf
. Celui-ci n'est utile que lorsqu'il n'y a pas d'autre moyen.
Vous pouvez mieux remplacer les super méthodes et/ou les variables, de sorte que vous puissiez utiliser tous les objets de la même manière, car ils feront quelque chose de différent (par exemple, imprimer son propre type).