¿Cómo puedo implementar la interfaz Iterable?

Dado el siguiente código, ¿cómo puedo iterar sobre un objeto de tipo 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(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); } } 

Iterable es una interfaz genérica. Un problema que pueda tener (en realidad, no ha dicho qué problema tiene, si lo tiene) es que si utiliza una interfaz / clase genérica sin especificar el tipo de argumento (s) puede borrar los tipos de tipos generics no relacionados dentro de la clase. Un ejemplo de esto es en referencia no genérica a resultados de clase generics en tipos de devolución no generics .

Así que al menos lo cambiaría a:

 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); } } 

y esto debería funcionar:

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

Sin el argumento tipo en Iterable, el iterador puede reducirse a ser un tipo Objeto, por lo que solo esto funcionará:

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

Este es un caso de esquina bastante oscuro de los generics de Java.

De lo contrario, brinde más información sobre lo que está sucediendo.

Antes que nada:

 public class ProfileCollection implements Iterable { 

Segundo:

 return m_Profiles.get(m_ActiveProfile);