我写了这段代码,它工作正常。但我有一个问题:
为什么应该是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;
}
}
答案 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
元素。