鉴于以下代码,我如何迭代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);
}
}
答案 0 :(得分:59)
Iterable是一个通用接口。您可能遇到的问题(您实际上没有说过您遇到的问题,如果有的话)是,如果您使用通用接口/类而未指定类型参数,则可以删除不相关的泛型类型的类型在课堂上。这方面的一个例子是Non-generic reference to generic class results in non-generic return types。
所以我至少会改为:
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上的type参数,迭代器可能会被简化为Object类型,所以只有这样才能工作:
for (Object profile : m_PC) {
// do stuff
}
这是一个非常模糊的Java泛型角落案例。
如果没有,请提供更多有关正在发生的事情的信息。
答案 1 :(得分:4)
首先关闭:
public class ProfileCollection implements Iterable<Profile> {
第二:
return m_Profiles.get(m_ActiveProfile);