Si la classe B
et la classe C
étendent la classe A
et que j'ai un objet de type B
ou C
name__, comment puis-je déterminer de quel type il s'agit d'une instance?
if (obj instanceof C) {
//your code
}
Utilisez Object.getClass () . Il retourne le type d'exécution de l'objet.
Plusieurs bonnes réponses ont été présentées, mais il y a encore plus de méthodes: Class.isAssignableFrom()
et une tentative simple de transtypage de l'objet (qui peut générer un ClassCastException
name__).
Résumons les différentes manières de tester si un objet obj
est une instance de type C
name__:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
name__Il y a une différence dans null
en ce qui concerne le traitement:
false
si obj
est null
(null
n'est une instance de rien).NullPointerException
name__.null
car null
peut être transtypé en n'importe quel type!À retenir:
null
n'est pas une instance de tout type mais il peut être converti de n'importe quel type.
Class.getName()
ne doit pas être utilisé pour effectuer un "is-instance-of" test parce que l'objet n'est pas de type C
mais une sous-classe de celui-ci, il peut avoir un nom et un package complètement différents (par conséquent, les noms de classe ne correspondront évidemment pas) mais il est toujours de type C
name__.Class.isAssignableFrom()
n'est pas symétrique :obj.getClass().isAssignableFrom(C.class)
renverrait false
si le type de obj
est une sous-classe de C
name__.Vous pouvez utiliser:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Mais je pense que la plupart du temps, ce n'est pas une bonne pratique de l'utiliser comme contrôle de flux ou quelque chose de similaire ...
Toute utilisation de l’une quelconque des méthodes suggérées est considérée comme une odeur de code basée sur un mauvais design OO.
Si votre conception est bonne, vous ne devriez pas avoir besoin d'utiliser getClass()
ou instanceof
.
N'importe laquelle des méthodes suggérées conviendra, mais vous devez simplement garder à l'esprit la conception.
Nous pouvons utiliser la réflexion dans ce cas
objectName.getClass().getName();
Exemple:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
Dans ce cas, vous obtiendrez le nom de la classe que l'objet passera à la variable de référence de l'interface HttpServletRequest
.
Il existe également une méthode .isInstance
sur la classe "Class
name__". Si vous obtenez la classe d'un objet via myBanana.getClass()
, vous pouvez voir si votre objet myApple
est une instance de la même classe que myBanana
via
myBanana.getClass().isInstance(myApple)
vérifier avec isinstance()
ne serait pas suffisant si vous voulez savoir en temps d'exécution. utilisation:
if(someObject.getClass().equals(C.class){
// do something
}