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

Collection et Stream Java Discussion :

comment savoir si un objet est itérable ?


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut comment savoir si un objet est itérable ?
    Bonjour à tous,
    j'ai un petit souci avec un code java. J'ai téléchargé 2 versions d'un code d'une même application
    Je vais appelé la version à jour "version n" et la version antérieur "version n-1"
    J'ai comparé les 2 et j'ai dans la version n la boucle suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (Iterator iterator = roleDescrp.iterator(); iterator.hasNext();)

    alors que dans la version n-1, je n'ai pas cette boucle
    J'ai donc voulu l'ajouter mais au surprise il m'indique que la méthode iterator() est indéfini pour le type RoleDescriptor (= type de la variable roleDescrp)
    J'ai donc comparé les codes des class RoleDescriptor de la version n et n-1 mais je ne vois aucune différence alors je ne comprend pas pourquoi j'ai ce problème ?
    PS: dans la class RoleDescriptor, la méthode iterator n'est implémenté dans aucune des 2 versions

    J'aimerai savoir comment sait on qu'un objet peut utiliser la méthode iterator() ?


    dans la version n, j'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package org.eclipse.epf.uma;
    import java.util.List;
    public interface RoleDescriptor
        extends Descriptor
    {
     
        public abstract Role getRole();
     
        public abstract void setRole(Role role);
     
        public abstract List getModifies();
     
        public abstract List getResponsibleFor();
    }
    je précise que pour cette version j'ai été obligé de décompiler un fichier .class
    en revanche pour la version n-1, j'ai bien les fichiers .java (c'est pour ça que je travail avec celle ci ^^ )

    Dans la version n-1, en retirant tout les commentaires j'obtiens ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package org.eclipse.epf.uma;
     
    import java.util.List;
    public interface RoleDescriptor extends Descriptor {
    	Role getRole();
            void setRole(Role value);
    	List getModifies();
    	List getResponsibleFor();
     
    } // RoleDescriptor

    comme vous pouvez le voir la différence est minime ...

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Pour que le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (Iterator iterator = roleDescrp.iterator(); iterator.hasNext();)
    fonctionne, il faut que la variable roleDescrp soit un Iterator. Donc la classe de cette variable doit implémenter l'interface Iterator d'une manière ou d'une autre. Ton problème vient du fait que la classe de la variable roleDescrp n'implémente pas l'interface Iterator (dans la version n-1). Pour connaître la classe de la variable, utilise la méthode getClass().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(roleDescrp.getClass());
    Enfin, pour vérifier qu'un objet est d'un certain type il y a l'opérateur instanceof
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(roleDescrp instanceof Iterator)
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Merci pour ta réponse
    Étant donné que j'utilise eclipse comme IDE, il m'indique la classe de la variable lorsque je positionne ma souris dessus. Il indique bien RoleDescriptor (qui correspond au code donné dans le premier message)

    De plus, il s'agit d'un plugin. A ma connaissance, il me semble pas pouvoir utiliser System.out.println dans ce cas la ...

    Par contre instanceof pourra peut être m'être utile mais il faut que je trouve une action à faire pour connaitre le résultat du if. Si tu as une idée, je suis preneur

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par Nom Voir le message
    Merci pour ta réponse
    Étant donné que j'utilise eclipse comme IDE, il m'indique la classe de la variable lorsque je positionne ma souris dessus. Il indique bien RoleDescriptor (qui correspond au code donné dans le premier message).
    Le type indiqué par eclipse est le type déclaré de la variable, pas le type de l'instance.

    Citation Envoyé par Nom Voir le message
    Par contre instanceof pourra peut être m'être utile mais il faut que je trouve une action à faire pour connaitre le résultat du if. Si tu as une idée, je suis preneur
    Ben à toi d'utiliser le if pour agir en conséquence. Si c'est bien un Iterator, tu fait le parcours, sinon tu fait autre chose (msg d'erreur, rien, etc.).
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Est-ce que tu as accès au code de l'interface Descriptor?
    En effet ton RoleDescriptor étend Descriptor. C'est peut-être la-dedans que ça a changé non?

  6. #6
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Citation Envoyé par le y@m's Voir le message
    Pour que le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (Iterator iterator = roleDescrp.iterator(); iterator.hasNext();)
    fonctionne, il faut que la variable roleDescrp soit un Iterator
    Bah euh... non il faut que la variable roleDescrp possède une fonction iterator() qui renvoie un Iterator!

  7. #7
    Membre extrêmement actif
    Profil pro
    Développeur Java Indépendant
    Inscrit en
    Mai 2007
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java Indépendant

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 333
    Par défaut
    Citation Envoyé par Jidefix Voir le message
    Bah euh... non il faut que la variable roleDescrp possède une fonction iterator() qui renvoie un Iterator!
    Oui enfin soit roleDescrp implémente Iterator et la méthode iterator renvoi this, soit la méthode iterator créer un iterator spécifique.
    C'est pareil on s'en fout non ?

    EDIT : non on s'en fout pas, dans le deuxième cas, le test instanceof sur roleDescrp n'est pas pertinent...

  8. #8
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Citation Envoyé par Herve-Loiret Voir le message
    EDIT : non on s'en fout pas, dans le deuxième cas, le test instanceof sur roleDescrp n'est pas pertinent...
    A mon avis il est dejà en train d'essayer de transformer son RoleDescriptor en Iterator la!

  9. #9
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par Jidefix Voir le message
    Bah euh... non il faut que la variable roleDescrp possède une fonction iterator() qui renvoie un Iterator!
    Oui quel c** ... fatigué moi
    Toutes mes excuses
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  10. #10
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    En java 5 et +, la plupart des classe qui fournissent un iterateur implémentent l'interface Iterable. Si c'est également le cas pour ta classe Descriptor, tu pourrais t'en sortir avec un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    roleDescrp instanceof Iterable.
    Sinon tu peux détecter la méthode iterator() par introspection avec quelque-chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try{
      roleDescrp.getClass().getMethod("iterator",null);
      System.out.println("iterator utilisable");
    }
    catch (NoSuchMethodException e){
      System.out.println("iterator non utilisable");
    }

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Merci à tous pour votre participation

    J'ai mis un certain temps à répondre car je tentais de modifier mon code puis le recompiler etc ...
    Beaucoup d'entre vous me suggère que ma class doit implémenter Iterable ou Iterator
    J'ai fais une recherche sur ces 2 mots dans les codes mais sans de résultat concluant.
    De plus j'ai tenté de faire quelque chose pour clarifier la situations mais sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    private List getRolesForTaskD(TaskDescriptor taskDescriptor) {		 
    	if(roleDescrp instanceof Iterator ) //j'ai aussi essayé avec Iterable
    	{
    		try 
    		{
    			FileWriter fichier = new FileWriter("c:\\iterator.txt");
    			fichier.write("iterator");
    			fichier.write("e" + roleDescrp.getClass());
    			fichier.close();
    		}
    		catch (java.io.IOException ex)
    		{
    			System.out.println("pb de fichier: " + ex);
    		};
     
    	}
    	else
    	{
    		try 
    		{
    			FileWriter fichier = new FileWriter("c:\\iterator.txt");
    			fichier.write("not iterable");
    			fichier.close();
    		}
    		catch (java.io.IOException ex)
    		{
    			System.out.println("pb de fichier: " + ex);
    		};
    	}
    }
    et bizarrement aucun fichier n'est créé

Discussions similaires

  1. comment savoir si un objet est sélectionné ?
    Par fran.duch dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 22/06/2012, 16h01
  2. Comment savoir qu'un objet est delete
    Par yupa dans le forum C++
    Réponses: 11
    Dernier message: 25/10/2007, 17h04
  3. [Access] Comment savoir qu'un champs est vide ?
    Par Oberown dans le forum ASP
    Réponses: 9
    Dernier message: 25/10/2004, 10h47
  4. Unix - Comment savoir si un fichier est ouvert
    Par freddyboy dans le forum C
    Réponses: 7
    Dernier message: 06/10/2004, 15h53
  5. Comment savoir qu'une fonction est standard ?
    Par D[r]eadLock dans le forum C
    Réponses: 5
    Dernier message: 24/03/2003, 14h42

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