52 votes

Java: Comment mettre en Œuvre Itérable

Étant donné le code suivant, comment puis-je effectuer une itération sur un objet de type ProfileCollection?

public class ProfileCollection implements Iterable {    
    private ArrayList<Profile> m_Profiles;

    public Iterator<Profile> iterator() {        
        Iterator<Profile> iprof = m_Profiles.iterator();
        return iprof; 
    }

    ...

    public Profile GetActiveProfile() {
        return (Profile)m_Profiles.get(m_ActiveProfile);
    }
}

public static void main(String[] args) {
     m_PC = new ProfileCollection("profiles.xml");

     // properly outputs a profile:
     System.out.println(m_PC.GetActiveProfile()); 

     // not actually outputting any profiles:
     for(Iterator i = m_PC.iterator();i.hasNext();) {
        System.out.println(i.next());
     }

     // how I actually want this to work, but won't even compile:
     for(Profile prof: m_PC) {
        System.out.println(prof);
     }
}

59voto

cletus Points 276888

Itérable est une interface générique. Un problème que vous pourriez avoir (vous n'avez pas dit quel est le problème que vous rencontrez, le cas échéant) est que si vous utilisez une interface générique/classe sans en préciser le type d'argument(s), vous pouvez effacer les types de sans rapport avec les types génériques au sein de la classe. Un exemple de ceci est dans la Non-référence générique à la classe générique des résultats en non-générique types de retour.

Donc, je voudrais au moins le modifier:

public class ProfileCollection implements Iterable<Profile> { 
    private ArrayList<Profile> m_Profiles;

    public Iterator<Profile> iterator() {        
        Iterator<Profile> iprof = m_Profiles.iterator();
        return iprof; 
    }

    ...

    public Profile GetActiveProfile() {
        return (Profile)m_Profiles.get(m_ActiveProfile);
    }
}

et cela devrait fonctionner:

for (Profile profile : m_PC) {
    // do stuff
}

Sans l'argument de type sur Itératif, l'itérateur peut être réduit à être le type de l'Objet si seulement cela va fonctionner:

for (Object profile : m_PC) {
    // do stuff
}

C'est un joli coin obscur cas de Java génériques.

Si non, veuillez fournir quelques infos sur ce qui se passe.

4voto

TofuBeer Points 32441

Tout d'abord:

public class ProfileCollection implements Iterable<Profile> {

Deuxième:

return m_Profiles.get(m_ActiveProfile);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X