web-dev-qa-db-fra.com

Voir si deux objets ont le même type

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?

19
Ramy Al Zuhouri

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.

44
Jack

Vous pourriez faire

if (obj1.getClass() == obj2.getClass()) { ... }
5
kba

Quelque chose comme ça:

if(classA.getClass().getName().equals(classB.getClass().getName()))
     <do something>
1
Kennet

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).

0
user717572