web-dev-qa-db-fra.com

Existe-t-il quelque chose comme instanceOf (Class <?> C) en Java?

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?

82
snakile

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.

158
gustafc

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:

  • L'opérateur instanceof si vous connaissez la classe au moment de la compilation.
  • Class.isInstance () si vous souhaitez comparer la classe d'un objet avec une classe inconnue au moment de la compilation.
  • Class.isAssignableFrom () si vous souhaitez vérifier l'assignation à partir de deux objets de classe.
19
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.

8

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

4
victor hugo

"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?

0
newacct

Tu peux faire:

if (foo instanceof classNameYouWantToCheck) 
0
fmsf