【问题标题】:Implementing an interface in an anonymous class as an iterator: type issue在匿名类中实现接口作为迭代器:类型问题
【发布时间】:2016-04-18 10:27:45
【问题描述】:

我正在处理的项目有问题。需要发生的一件事是创建一个检查器,该检查器返回一个实现接口的迭代器,同时使用匿名类。上下文是一个文件系统,基本上,迭代器只需要返回迭代器工作的目录的内容。所以这是我目前得到的代码:

目录类:

public class Directory {

   ...

    public Iterator<DiskItem> iterator() {
       return new DirectoryIterator() {

            int cursor = 1;
            int end = Directory.this.getNbItems();

            public boolean hasNext() {
                return this.cursor < end;
            }

            public DiskItem next(){
                if(this.hasNext()) {
                    Directory.this.getItemAt(this.cursor++);
                }
                else
                    throw new NoSuchElementException();
            }

            @Override
            public int getNbRemainingItems() {
                return this.end - this.cursor;
            }

            @Override
            public DiskItem getCurrentItem() throws IndexOutOfBoundsException {
                return Directory.this.getItemAt(this.cursor);
            }

            @Override
            public void advance() {
                if(this.hasNext()) {
                    this.cursor++;
                }
                else
                    throw new NoSuchElementException();                 
            }

            @Override
            public void reset() {
                this.cursor = 1;            
            }
        }
}

DirectoryIterator 接口:

public interface DirectoryIterator {

    int getNbRemainingItems();

    DiskItem getCurrentItem() throws IndexOutOfBoundsException;

    void advance();

    void reset();


}

我遇到的问题是错误

Type mismatch: cannot convert from new DirectoryIterator(){} to Iterator<DiskItem>

这可能是因为 DirectoryIterator 没有类型 Iterator,但因为它是一个接口,所以我不能给它任何类型。

有人知道如何解决这个问题吗?

提前致谢

【问题讨论】:

  • 你可以让DirectoryIterator实现Iterator&lt;DiskItem&gt;
  • 它更像是从 Iterator 扩展 DirectoryIterator 而不是实现
  • @PurityLake 为什么不把这个作为答案(并修复工具与扩展那里)?
  • @Kayaman Ya,哎呀,我的话有点滑倒了,有一段时间没接触过 java,所以它让我对工具和扩展一无所知

标签: java interface iterator anonymous-class


【解决方案1】:

解决此问题的一种方法是使 DirectoryIterator 扩展 Iterator&lt;DiskItem&gt;

像这样:

interface DirectoryIterator extend Iterator<DiskItem> {
    ...
}

这样DirectoryIteratorIterator&lt;DiskItem&gt; 的子类,因此使用多态性我们可以将DirectoryIterator 作为Iterator&lt;DiskItem&gt; 返回

希望对您有所帮助,如果这不能解决您的问题,请务必发表评论。

【讨论】:

  • 谢谢,错误消失了。不过,我确实遇到了另一个问题,在测试类 Directory 中的方法迭代器时,我只能调用 Iterator 类的默认方法,而我自己的方法都没有(我从 DirectoryIterator 接口实现的那些),例如,如果我创建了一个包含一些文件的目录“父”,我只能调用 next() 和 remove() 等,但不能调用 getNbOfRemainingItems()..
  • 是的,没想到,返回 Iterator 有什么理由吗?
  • 好吧,他们在论文中明确指出:“您的解决方案应该包括一个检查器,它提供了通过目录的直接内容的能力。这个检查器应该返回一个迭代器,它实现了接口 DirectoryIterator . 使用匿名类。”
  • 解决了,我把 'public Iterator iterator() {' 改成 'public DirectoryIterator iterator() {',现在我所有的函数都可以工作了!这实际上是我在 stackoverflow 上的第一个问题,真的很惊讶我得到回复的速度有多快!感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 2015-04-25
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多