Как я могу реализовать интерфейс Iterable?

Учитывая следующий код, как я могу перебрать объект типа 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, итератор может быть уменьшен до типа Object, так что только это будет работать:

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

Это довольно неясный угловой пример дженериков Java.

Если нет, пожалуйста, предоставьте больше информации о том, что происходит.

Прежде всего:

public class ProfileCollection implements Iterable<Profile> {

Во-вторых:

return m_Profiles.get(m_ActiveProfile);
Другие вопросы по тегам