为什么在实现Interator <E>时必须使用Java泛型类型

时间:2020-10-07 04:45:51

标签: java

我写了这段代码,它工作正常。但我有一个问题:

为什么应该是public class PeekingIterator<E> implements Iterator<E>,而不是 public class PeekingIterator implements Iterator<E>。我之所以这样问是因为,如果我在代码中用Integer替换E,它将可以工作。我的意思是public class PeekingIterator implements Iterator<Integer>是正确的。

import java.util.Iterator;

public class PeekingIterator<E> implements Iterator<E> {

    private E nextElem;
    private boolean hasNextElem;
    private Iterator<E> iter;

    public PeekingIterator(Iterator<E> iterator) {
        iter = iterator;
        nextElem = next();
        hasNextElem = true;

    }

    public E peek() {
        return nextElem;
    }

    @Override
    public E next() {
        if (!hasNextElem) {
            throw new RuntimeException();
        }
        E res = nextElem;
        if (hasNext()) {
            nextElem = iter.next();
            hasNextElem = true;
        } else {
            hasNextElem = false;
        }
        return res;

    }

    @Override
    public boolean hasNext() {
        return hasNextElem;
    }

}

1 个答案:

答案 0 :(得分:4)

E是一个标识符。如果您说class PeekingIterator<E> implements Iterator<E>,则编译器知道此标识符是通用类型参数。

这允许您将PeekingIterator实例化为:

PeekingIterator<Integer> it1 = new PeekingIterator<>();

PeekingIterator<String> it2 = new PeekingIterator<>();

即您的PeekingIterator类可以遍历任何类型的元素。

如果将PeekingIterator声明为class PeekingIterator implements Iterator<E>,则编译器将搜索名为E的某种类型(类或接口)。如果找不到,那是编译错误。

如果您声明class PeekingIterator implements Iterator<Integer>,这是可行的,因为Integer是一个类。这限制了您的PeekingIterator总是迭代Integer元素。

相关问题