在匿名类中实现接口作为迭代器:类型问题

时间:2016-04-18 10:27:45

标签: java interface iterator anonymous-class

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

目录类:

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类型,但因为它是一个接口,我不能给它任何类型。

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

提前致谢

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是让DirectoryIterator扩展Iterator<DiskItem>

像这样:

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

这种方式DirectoryIteratorIterator<DiskItem>的子类,所以使用多态,我们可以将DirectoryIterator作为Iterator<DiskItem>

返回

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