Given the following code, how can I iterate over an object of 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); } }
Iterable is a generic interface. A problem you might be having (you haven’t actually said what problem you’re having, if any) is that if you use a generic interface/class without specifying the type argument(s) you can erase the types of unrelated generic types within the class. An example of this is in Non-generic reference to generic class results in non-generic return types.
So I would at least change it to:
and this should work:
Without the type argument on Iterable, the iterator may be reduced to being type Object so only this will work:
This is a pretty obscure corner case of Java generics.
If not, please provide some more info about what’s going on.