Как я могу реализовать итерационный интерфейс?
учитывая следующий код, как я могу перебирать объект типа 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);
     }
}
2 ответа:
Iterable-это универсальный интерфейс. Проблема, с которой вы можете столкнуться (вы на самом деле не сказали, какая проблема у вас есть, если есть), заключается в том, что если вы используете универсальный интерфейс/класс без указания аргумента(ОВ) типа, вы можете стереть типы несвязанных универсальных типов в классе. Пример этого находится в неродовая ссылка на универсальный класс приводит к неродовым возвращаемым типам.
поэтому я бы по крайней мере изменил его на:
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); } }и этого должно работать:
for (Profile profile : m_PC) { // do stuff }без аргумента типа на Iterable итератор может быть уменьшен до объекта типа, поэтому только это будет работать:
for (Object profile : m_PC) { // do stuff }Это довольно неясный угловой случай дженериков Java.
Если нет, пожалуйста, предоставьте дополнительную информацию о том, что происходит.