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

Étant donné le code suivant, comment puis-je itérer sur un object de type ProfileCollection?

public class ProfileCollection implements Iterable { private ArrayList m_Profiles; public Iterator iterator() { Iterator iprof = m_Profiles.iterator(); return iprof; } ... public Profile GetActiveProfile() { return (Profile)m_Profiles.get(m_ActiveProfile); } } public static void main(Ssortingng[] 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 comstack: for(Profile prof: m_PC) { System.out.println(prof); } } 

Iterable est une interface générique. Un problème que vous pourriez avoir (vous n’avez pas encore 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. dans la classe. Un exemple de ceci est dans Référence non générique aux résultats de classe génériques dans les types de retour non génériques .

Donc je changerais au moins pour:

 public class ProfileCollection implements Iterable { private ArrayList m_Profiles; public Iterator iterator() { Iterator 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 Iterable, l’iterator peut être réduit à être de type Object pour que cela fonctionne seulement:

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

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

Si ce n’est pas le cas, veuillez fournir plus d’informations sur ce qui se passe.

Tout d’abord:

 public class ProfileCollection implements Iterable { 

Seconde:

 return m_Profiles.get(m_ActiveProfile);