Как я могу реализовать интерфейс 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);