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
est de la classe Point
je veux que x.instanceOf(Point.class)
soit true
et aussi x.instanceOf(Object.class)
soit true
.
Je veux que cela fonctionne aussi 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?
Class.isInstance fait ce que vous voulez.
if (Point.class.isInstance(someObj)){
...
}
Bien sûr, vous ne devriez pas l'utiliser si vous pouviez utiliser instanceof
à la place, mais pour les scénarios de réflexion, cela est souvent utile.
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 est de la classe Point, je veux x.instanceOf (Point.class)
Euh, quoi? Que sont o, p et x?
Je veux que cela fonctionne aussi pour les types primitifs. Par exemple, si x est un entier, alors x.instanceOf (Integer.class) et également x.instanceOf (Object.class) doivent être vrais.
Non, il ne devrait même pas compiler. 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 le cas où elles s'appliquent:
instanceof
si vous connaissez la classe au moment de la compilation.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. Comme vous ne pouvez pas leur créer de méthodes, vous avez besoin d'une classe qui conserve la méthode. Ainsi, 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.
En fait, dans Java il y a 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 un interface particulière.
if(obj instanceof SomeClass) {
// Do something
}
Le Java Tutorial a un bon exemple de cet opérateur
"Je veux que cela fonctionne également pour les types primitifs. Par exemple, si x est un entier, alors x.instanceOf (Integer.class) et également x.instanceOf (Object.class) devrait être vrai."
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 d'Integer ni d'Object. Le type d'une valeur primitive est toujours connu statiquement 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?
Tu peux faire:
if (foo instanceof classNameYouWantToCheck)