gpt4 book ai didi

java - 如何实现 Iterable 接口(interface)?

转载 作者:IT老高 更新时间:2023-10-28 20:29:15 28 4
gpt4 key购买 nike

鉴于以下代码,我如何迭代 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 是一个通用接口(interface)。您可能遇到的一个问题(您实际上并没有说您遇到了什么问题,如果有的话)是,如果您使用泛型接口(interface)/类而不指定类型参数,您可以删除不相关的泛型类型的类型类内。 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 上的类型参数,迭代器可能会被简化为 Object 类型,所以只有这样才能工作:

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

这是 Java 泛型的一个非常晦涩的极端案例。

如果没有,请提供更多关于发生了什么的信息。

关于java - 如何实现 Iterable 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601658/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com