web-dev-qa-db-fra.com

Comment puis-je implémenter l'interface Iterable?

Étant donné le code suivant, comment puis-je parcourir 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);
     }
}
52
Dewayne

Iterable est une interface générique. Un problème que vous pourriez avoir (vous n'avez pas vraiment dit quel problème vous rencontrez, le cas échéant) est que si vous utilisez une interface/classe générique sans spécifier le ou les arguments de type, vous pouvez effacer les types de types génériques non liés. au sein de la classe. Un exemple de ceci est dans ne référence non générique à des résultats de classe génériques dans des types de retour non génériques .

Je voudrais donc au moins le changer en:

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 type sur Iterable, l'itérateur peut être réduit à être de type Object donc seul cela fonctionnera:

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

Ceci est un cas d'angle assez obscur des génériques Java.

Sinon, veuillez fournir plus d'informations sur ce qui se passe.

59
cletus

Tout d'abord:

public class ProfileCollection implements Iterable<Profile> {

Seconde:

return m_Profiles.get(m_ActiveProfile);
4
TofuBeer