当前位置: 首页 > 面试题库 >

如何实现Iterable接口?

晋弘义
2023-03-14
问题内容

给定以下代码,如何遍历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是通用接口。您可能遇到的问题(实际上并没有说出您遇到的问题,如果有的话)是,如果使用通用接口/类而不指定类型实参,则可以擦除不相关的通用类型在课堂上。

因此,我至少将其更改为:

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泛型的一个晦涩难解的案例。

如果没有,请提供有关正在发生的事情的更多信息。



 类似资料:
  • 问题内容: 我不确定如何在我的抽象类中实现类似的接口。我有以下示例代码可用来尝试解决这个问题: 我有一个测试类,该类将创建Animal类型的对象,但是我希望在该类中具有一个可比的接口,以使发现的年纪高于低位。我不知道如何去解决这个问题。 问题答案: 您只需要定义即p。然后,您必须以自己喜欢的方式实现该方法。 使用的实现,具有较高级别的动物将获得更高的顺序。我希望你的想法和这个例子。

  • 问题内容: 如何实现与C#代码等效的Python? 这是一个好主意吗??请在您的答案中举例说明。 问题答案: 正如其他人在这里提到的: 在Python中不需要接口。这是因为Python具有适当的多重继承,还具有鸭式输入法,这意味着 必须 在Java中具有接口的地方,而不必在Python中具有接口。 也就是说,接口还有多种用途。其中一些被Python 2.6中引入的Pythons抽象基类覆盖。如果您

  • 我不确定如何在我的抽象类中实现一个可比较的接口。我有下面的示例代码,我正在使用它来尝试和得到我的头脑周围: 我有一个测试类,它将创建动物类型的对象,但是我想在这个类中有一个类似的接口,这样更早的发现排名就会更高。不过,我不知道该怎么做。

  • 问题内容: 我是一个初学者,我无法理解界面的实际效果。 问题答案: 除了Jeremy所说的以外,它的主要好处是它具有自己的语法糖:增强的for- loop 。如果您有个,则可以执行以下操作: 很好很容易,不是吗?编译器会在后台处理创建,检查它和调用的所有肮脏工作。 而且由于大多数集合都实现了或具有返回一个视图的视图(例如的或),所以这使使用集合更加容易。 该的Javadoc给出了实现类的完整列表。

  • 问题内容: 如何创建实现此接口的Clojure对象,然后从Java代码调用它? 问题答案: 是实现接口的首选- 重型,较旧且较慢,因此应尽可能避免。一个实现看起来像:

  • 问题内容: 我试图了解Java 和接口 我正在写这堂课 它似乎正在工作。 我应该有: 或者我应该把外面的 哪一个更好? 问题答案: 你应该几乎 从来没有 同时实现,并在同一个班。他们做不同的事情。迭代器自然是 有状态的 -当您迭代使用它时,它必须更新其世界观。但是,迭代器仅需要能够创建新的迭代器。特别是,您可能有多个迭代器同时处理同一个原始可迭代对象。 您当前的方法几乎可以-我会更改实现的某些方面