2017-08-13 4 views
1

私はこの未確認の割り当て: 'するjava.util.Iterator <java.lang.Integerの>' から '匿名java.util.Iteratorの'

public class Symbol implements Iterable<Integer> { 
    private int n = 123; 

    public Iterator<Integer> iterator() { 
     return new Iterator() { 

      int counter = 0; 

      @Override 
      public boolean hasNext() {return counter < n;} 

      @Override 
      public Integer next() {return counter++;} 

      @Override 
      public void remove() { throw new UnsupportedOperationException(); } 
    }; 
} 

のようなクラスを持って、私は次の警告

を取得
Unchecked assignment: 'anonymous java.util.Iterator' to 'java.util.Iterator<java.lang.Integer>' 

私は警告を無視するか、forループをarraylistに書き込んでリストのイテレータを返すことができますが、私はそれを怠惰にしたいと思います。

public Iterator<Integer> iterator() { 
    return new Iti(); 
} 

private class Iti implements Iterator<Integer>{ 

    final int N = n; 

    int counter = 0; 

    @Override 
    public boolean hasNext() {return counter < N; } 

    @Override 
    public Integer next() {return counter++;} 

    @Override 
    public void remove() { throw new UnsupportedOperationException(); } 
} 
+0

ただ、 '新しいイテレータ' – Oleg

+0

'' <...> 'なしIterator'が生タイプであり、あなたがジェネリック型と生タイプを混在させることはできませんが返されます。 –

答えて

0

私の最高のショットは、プライベートクラスを使用することです。

+1

これを行う必要はありません。匿名の内部クラスを使用しても問題ありません.OPは生の型の使用をやめるだけです。 –

+0

@JonSkeetそれは自分自身に答えようとするOPだった。 – Oleg

+2

@Oleg:うわー、確かに。なぜ彼らがすでに特定したオプションとして問題になっていなかったのか分かりません... –

0

使用return new Iterator<Integer>()

4

あなたがするんだすべては、生タイプの代わりにIterator<Integer>を使用するように匿名クラスを変更です。その時点で

public Iterator<Integer> iterator() { 
    Iterator iterator = new Iterator() { ... }; 
    return iterator; 
} 

return new Iterator<Integer>() { 
    // Code here as before 
}; 

が、それはこのように書かれていた想像してみて問題は明らかです、そうですか?生タイプの値Iteratorを使用して、タイプIterator<Integer>のメソッドから戻ります。ローカル変数がなければまったく同じです。提案の変化と、それは明らかに、合理的に同等です:

public Iterator<Integer> iterator() { 
    Iterator<Integer> iterator = new Iterator<Integer>() { ... }; 
    return iterator; 
} 
関連する問題