Je veux vérifier si un objet o
est une instance de la classe C
ou d'une sous-classe de C
.
Par exemple, si p
c'est de classe, Point
je veux x.instanceOf(Point.class)
être true
et aussi x.instanceOf(Object.class)
être true
.
Je veux que cela fonctionne également pour les types primitifs en boîte. Par exemple, si x
est un Integer
alors x.instanceOf(Integer.class)
devrait être true
.
Existe-t-il une telle chose? Sinon, comment puis-je implémenter une telle méthode?
java
reflection
instanceof
snakile
la source
la source
Réponses:
Class.isInstance fait ce que vous voulez.
if (Point.class.isInstance(someObj)){ ... }
Bien sûr, vous ne devriez pas l'utiliser si vous pouviez l'utiliser à la
instanceof
place, mais pour les scénarios de réflexion, il est souvent utile.la source
if (a instanceof Point)
- mais que vous le faites d'une manière plus compliquée, quiconque lit le code est tenu de penser "oh, il doit y avoir une raison pour que cela soit fait à la dure", et puis passez à la documentation pour découvrir en quoiClass.isInstance
diffère deinstanceof
. Vous perdez le temps de vos collègues.Euh, quoi? Que sont o, p et x?
Non, il ne devrait même pas être compilé. Les primitives ne sont pas des objets et vous ne pouvez pas appeler de méthodes dessus.
Quoi qu'il en soit, il y a trois choses, dont l'une peut certainement atteindre ce que vous voulez (elles diffèrent quelque peu dans l'endroit où elles s'appliquent exactement:
instanceof
opérateur si vous connaissez la classe au moment de la compilation.la source
x instanceof Integer x instanceof Object
il suffit d'utiliser la bonne syntaxe
pour les types primitifs, vous devez le faire complètement différemment. Puisque vous ne pouvez pas créer de méthodes pour eux, vous avez besoin d'une classe qui conserve la méthode. Donc, au lieu de "x.instanceOf (Integer.Class)", vous devez appeler "MyClassComparer.instanceOf (x, Integer.Class)" ou quelque chose comme ça. Cela pourrait facilement être implémenté par des méthodes de surcharge, mais je ne vois pas de cas où cette fonctionnalité serait souhaitable du tout.
la source
En fait, en Java, il existe un opérateur booléen appelé instanceof qui peut être utilisé pour déterminer si un objet est une instance d'une classe, une instance d'une sous-classe ou une instance d'une classe qui implémente une interface particulière.
if(obj instanceof SomeClass) { // Do something }
Le tutoriel Java a un bon exemple de cet opérateur
la source
Tu peux faire:
if (foo instanceof classNameYouWantToCheck)
la source
"Je veux que cela fonctionne aussi pour les types primitifs. Par exemple, si x est un entier, alors x.instanceOf (Integer.class) et aussi x.instanceOf (Object.class) devraient être true."
Pourquoi? Les types primitifs et les types de référence sont complètement séparés. Un int primitif n'est pas un sous-type de Integer ni Object. Le type d'une valeur primitive est toujours connu de manière statique au moment de la compilation, il est donc inutile de tester son type. Bien sûr, vous pouvez encadrer une valeur primitive, puis tester son type:
(Integer)5 instanceof Integer
Mais quel serait le point?
la source
Je pense que vous êtes confus sur instanceof pour les objets bruts et génériques
obj instanceof Class obj instanceof Class<?> // this is the one you want
la source
instanceof
.