IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Class : instanceof, isAssignable(), isInstance()


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut Class : instanceof, isAssignable(), isInstance()
    Bonjour,

    J'aurais besoin de tester si une instance d'un objet implémente une interface. Cela ressemblerait à vouloir tester si une classe implémente Cloneable avant de le cloner.
    D'habitude, j'utilise "instanceof", et cela marche.

    Mais en fouinant un peu, j'ai vu les méthodes isAssignableFrom et isInstance de la classe Class. Pour les quelques tests que j'ai fais (assez limité j'avoue), les 3 méthodes donnent le même résultat (et je ne suis pas sûr de bien comprendre la javadoc).
    Autrement dis, pour un objet obj, "obj instanceof MaClasse" est identique à "MaClasse.class.isAssignableFrom(obj.getClass())" et "MaClasse.class.isInstance(obj)".
    Je pense que les méthodes de la classe Class ne servent que lorsqu'on ne connait pas le type de l'objet en cours de manipulation.

    Ai-je raison ? Quelqu'un aurait-il des exemples ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Il y a quelques nuances à bien différencier :

    l'opérateur instanceof et Class#isInstance(Object) font le même boulot. Effectivement, le second sert lorsque l'on ne connaît de facto pas la classe.

    Par exemple, tu veux savoir si l'instance est soit un String, soit un Integer, soit un Long :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public boolean isInstance(Object o, Class... types) {
      for (Class type: types) {
        if (type.isInstance(o)) {
          return true;
        }
      }
      return false;
    }
     
    ...
     
    if (isInstance(obj, String.class, Integer.class, Long.class)) {
      ...
    }
    En revanche, isAssignableFrom permet de dire si une classe peut être assignée à partir d'une autre. En gros, si la première soit a) étend la seconde, soit b) l'implémente.

    Mais l'ordre a de l'importance, car l'inverse ne sera pas spécialement vrai.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List.class.isAssignableFrom(ArrayList.class);   // Possible car ArrayList implémente List
    Object.class.isAssignableFrom(ArrayList.class); // Possible car ArrayList étend Object
    ArrayList.class.isAssignableFrom(List.class);   // Impossible car List n'étend pas, n'implémente pas ArrayList
    ArrayList.class.isAssignableFrom(Object.class); // Impossible car Object n'étend pas, n'implémente pas ArrayList

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut
    D'accord ! Merci pour ces précisions !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Classes soeurs avec instanceof
    Par geos25 dans le forum Langage
    Réponses: 5
    Dernier message: 20/05/2008, 12h29
  3. instanceof sans connaitre la classe
    Par willoi dans le forum Langage
    Réponses: 7
    Dernier message: 13/04/2007, 14h05
  4. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo