2016-04-18 24 views
0

私が取り組んでいるプロジェクトに問題があります。起こる必要があることの1つは、インターフェイスを実装するイテレータを返し、匿名クラスを使用するインスペクタを作成することです。コンテキストはファイルシステムであり、基本的にイテレータはイテレータが動作するディレクトリの内容を返すだけです。だからここに私は、現時点で得たコードは次のとおりです。匿名クラスのイテレータとしてのインターフェイスの実装:問題を発行する

Directoryのクラス:

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に型イテレータがないためですが、int型であるためです私はそれをどんなタイプでも与えることはできません。

誰でもこの問題を解決する方法はありますか?事前に

おかげ

+2

あなたは 'DirectoryIterator'は'イテレータ ' – PurityLake

+0

を実装して作ることができるそれはこの答え作る(および実装対が拡張修正)ではないのはなぜイテレータからのDirectoryIteratorの延長ではなく、道具 –

+0

@PurityLake以上ですか? – Kayaman

答えて

0

DirectoryIteratorこのようIterator<DiskItem>

を延長させることであろう。この問題を修正する方法:

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

この方法DirectoryIteratorはとても多型を使用してIterator<DiskItem>のサブクラスであり、我々 DirectoryIteratorIterator<DiskItem>

として返すことができます10

これで問題が解決しない場合は、コメントを残すことをお勧めします。

+0

ありがとう、エラーが消えました。私は別の問題を抱えていましたが、クラスDirectoryのメソッドイテレータをテストしている間は、Iteratorクラスのデフォルトメソッドを呼び出すことができましたが、自分自身(DirectoryIteratorインターフェイスから実装したもの)いくつかのファイルを含むディレクトリ 'parent'を作成しましたが、next()とremove()などしか呼び出せませんでしたが、getNbOfRemainingItems()は呼び出せませんでした.. – Jules

+0

これは考えていませんでした。イテレータ? – PurityLake

+0

まあ、論文では、「あなたのソリューションには、ディレクトリの直接の内容を調べる機能を提供するインスペクタが含まれている必要があります。このインスペクタは、DirectoryIteratorインタフェースを実装するイテレータを返す必要があります。 " – Jules