2017-08-13 19 views
1

我有這樣未選中分配: '匿名java.util.Iterator的' 到 'java.util.Iterator的<java.lang.Integer中的>'

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並返回列表的迭代器,但是我想這樣做很懶,我想這樣做,即沒有警告。

+0

只是不'返回新的迭代' – Oleg

+0

'Iterator'沒有'<...>'是原始類型,你不應該混合使用泛型類型和原始類型。 –

回答

0

我最好的拍攝是使用私有類:

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(); } 
} 
+1

沒有必要這樣做。使用匿名內部類很好--OP只需要停止使用原始類型。 –

+0

@JonSkeet這是OP試圖回答自己。 – Oleg

+2

@奧列格:的確如此。不知道爲什麼它不在問題中作爲他們已經識別的選項... –

0

使用return new Iterator<Integer>()

4

所有你所要做的就是改變你的匿名類使用Iterator<Integer>而不是原始類型:

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

想象它已經被寫成這樣:

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

在這一點上問題很明顯,對嗎?您正在使用原始類型Iterator的值從Iterator<Integer>類型的方法返回。那麼沒有本地變量就完全一樣。隨着所建議的修改,這相當於明確,合理的:

public Iterator<Integer> iterator() { 
    Iterator<Integer> iterator = new Iterator<Integer>() { ... }; 
    return iterator; 
} 
相關問題