未经检查的赋值:'anonymous java.util.Iterator'到'java.util.Iterator <java.lang.integer>'

时间:2017-08-13 14:46:13

标签: java generics

我有一个这样的课程

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并返回列表的迭代器但是我想这样做很懒,我想做得对,即没有警告。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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(); }
}

答案 2 :(得分:0)

使用return new Iterator<Integer>()