Si la classe B
et la classe C
étendent la classe A
et que j'ai un objet de type B
ou C
, comment puis-je déterminer de quel type il s'agit d'une instance?
java
inheritance
transporteur
la source
la source
Réponses:
la source
if(!(obj instanceof C))
code
Child1 suivant child1 = new Child1 (); Parent1 parentChild = new Child2 (); Child2 child2 = nouveau Child2 (); (instance child1 de Parent1); (instance child1 de Child1); (instance parentChild de Child2); (instance parentChild de Parent1); (instance parentChild de Child1);code
, il peut effacer l'intention d'instanceof.Utilisez Object.getClass () . Il renvoie le type d'exécution de l'objet.
la source
Plusieurs bonnes réponses ont été présentées, mais il existe encore plus de méthodes:
Class.isAssignableFrom()
et simplement essayer de lancer l'objet (ce qui pourrait jeter unClassCastException
).Résumés possibles
Résumons les différentes manières de tester si un objet
obj
est une instance de typeC
:Différences de
null
manipulationIl existe cependant une différence de
null
manipulation:false
siobj
estnull
(null
n'est pas une instance de quoi que ce soit).NullPointerException
évidemment.null
carnull
peuvent être castées sur n'importe quel type!Remarques
Class.getName()
ne doit pas être utilisé pour effectuer un test "is-instance-of" car si l'objet n'est pas de typeC
mais une sous-classe de celui-ci, il peut avoir un nom et un package complètement différents (donc les noms de classe ne correspondront évidemment pas) mais il est toujours de typeC
.Class.isAssignableFrom()
n'est pas symétrique :obj.getClass().isAssignableFrom(C.class)
retourneraitfalse
si le type deobj
est une sous-classe deC
.la source
Vous pouvez utiliser:
HTH. Mais je pense que la plupart du temps, ce n'est pas une bonne pratique de l'utiliser pour contrôler le flux ou quelque chose de similaire ...
la source
Toute utilisation de l'une des méthodes suggérées est considérée comme une odeur de code basée sur une mauvaise conception OO.
Si votre design est bon, vous ne devriez pas avoir à utiliser
getClass()
ouinstanceof
.N'importe laquelle des méthodes suggérées fera l'affaire, mais juste quelque chose à garder à l'esprit, au niveau de la conception.
la source
Nous pouvons utiliser la réflexion dans ce cas
Exemple:-
Dans ce cas, vous obtiendrez le nom de la classe que l'objet passera à la
HttpServletRequest
variable de référence d'interface.la source
obj.getClass()
renverra le nom de classe, préfixe par le motclass
request.getClass().getName();
imprime tout le paquet! avec le nom de la classeIl existe également une
.isInstance
méthode sur laClass
classe " ". si vous obtenez la classe d'un objet via,myBanana.getClass()
vous pouvez voir si votre objetmyApple
est une instance de la même classe quemyBanana
viala source
vérifier avec
isinstance()
ne serait pas suffisant si vous voulez savoir en temps d'exécution. utilisation:la source
J'utilise la fonction Blow dans ma classe GeneralUtils, vérifiez qu'elle peut être utile
la source
J'ai utilisé des génériques Java 8 pour obtenir l'instance d'objet au moment de l'exécution plutôt que d'avoir à utiliser un commutateur
passez n'importe quel type de données et la méthode imprimera le type de données que vous avez passé lors de son appel. par exemple
Voici la sortie
la source