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

87

Je veux vérifier si un objet oest une instance de la classe Cou d'une sous-classe de C.

Par exemple, si pc'est de classe, Pointje veux x.instanceOf(Point.class)être trueet aussi x.instanceOf(Object.class)être true.

Je veux que cela fonctionne également pour les types primitifs en boîte. Par exemple, si xest un Integeralors x.instanceOf(Integer.class)devrait être true.

Existe-t-il une telle chose? Sinon, comment puis-je implémenter une telle méthode?

snakile
la source
la gestion des cours en boîte est un peu
compliquée

Réponses:

172

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 instanceofplace, mais pour les scénarios de réflexion, il est souvent utile.

Gustafc
la source
6
@Ahamed c'est probablement plus lent, mais le pire c'est que c'est plus difficile à comprendre! S'il existe un moyen très simple de faire quelque chose - comme 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 quoi Class.isInstancediffère de instanceof. Vous perdez le temps de vos collègues.
gustafc
21

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 aussi x.instanceOf (Object.class) doivent être true.

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:

  • L' instanceofopérateur si vous connaissez la classe au moment de la compilation.
  • Class.isInstance () si vous souhaitez vérifier la classe d'un objet par rapport à une classe inconnue au moment de la compilation.
  • Class.isAssignableFrom () si vous souhaitez vérifier l'assignabilité de deux objets de classe.
Michael Borgwardt
la source
9
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.

Erich Kitzmueller
la source
4

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

Victor Hugo
la source
1
vous ne pouvez pas utiliser instanceof avec des types primitifs
dfa
4
Il a confondu les types primitifs avec les objets. Veuillez lire ... "Par exemple, si x est un entier, alors x.instanceOf (Integer.class) et aussi x.instanceOf (Object.class) doivent être true." Honte à vous vers le bas droit de vote toutes les réponses
victor hugo
Appuyant (sp) la suggestion d'utiliser le tutoriel Java. C'est une bonne référence pour apprendre la langue elle-même.
luis.espinal
0

Tu peux faire:

if (foo instanceof classNameYouWantToCheck) 
fmsf
la source
vous ne pouvez pas utiliser instanceof avec des types primitifs
dfa
La classe était juste pour montrer qu'il devait y écrire le nom de la classe. Je vais le réparer
fmsf
0

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

newacct
la source
-2

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
Paul Bors
la source
2
Vous ne pouvez pas utiliser de génériques sur le côté droit de l'opérateur instanceof en raison de l'effacement de type.
Matthias
2
Non, c'est vous qui êtes confus à ce sujet. Vous devez utiliser le type brut après instanceof.
Dawood ibn Kareem