为什么在我实现Iterator<E>时,Java 泛型类型是必需的。

huangapple go评论110阅读模式
英文:

why the java generic type is a must when I implement Interator<E>

问题

以下是翻译好的部分:

  1. 我写了这段代码它运行良好但我有一个问题
  2. 为什么它应该是 ```public class PeekingIterator<E> implements Iterator<E>```而不是
  3. ```public class PeekingIterator implements Iterator<E>```我之所以问这个问题是因为如果我在代码中将 E 替换为 Integer它也能工作我的意思是 ```public class PeekingIterator implements Iterator<Integer>``` 是正确的
  4. import java.util.Iterator;
  5. public class PeekingIterator<E> implements Iterator<E> {
  6. private E nextElem;
  7. private boolean hasNextElem;
  8. private Iterator<E> iter;
  9. public PeekingIterator(Iterator<E> iterator) {
  10. iter = iterator;
  11. nextElem = next();
  12. hasNextElem = true;
  13. }
  14. public E peek() {
  15. return nextElem;
  16. }
  17. @Override
  18. public E next() {
  19. if (!hasNextElem) {
  20. throw new RuntimeException();
  21. }
  22. E res = nextElem;
  23. if (hasNext()) {
  24. nextElem = iter.next();
  25. hasNextElem = true;
  26. } else {
  27. hasNextElem = false;
  28. }
  29. return res;
  30. }
  31. @Override
  32. public boolean hasNext() {
  33. return hasNextElem;
  34. }
  35. }
英文:

I wrote this piece of code, and it works fine. but I have a question:

why it should be public class PeekingIterator&lt;E&gt; implements Iterator&lt;E&gt;, not
public class PeekingIterator implements Iterator&lt;E&gt;. I ask this because if I replace E with Integer in the code, it will work. I mean public class PeekingIterator implements Iterator&lt;Integer&gt; is correct.

  1. import java.util.Iterator;
  2. public class PeekingIterator&lt;E&gt; implements Iterator&lt;E&gt; {
  3. private E nextElem;
  4. private boolean hasNextElem;
  5. private Iterator&lt;E&gt; iter;
  6. public PeekingIterator(Iterator&lt;E&gt; iterator) {
  7. iter = iterator;
  8. nextElem = next();
  9. hasNextElem = true;
  10. }
  11. public E peek() {
  12. return nextElem;
  13. }
  14. @Override
  15. public E next() {
  16. if (!hasNextElem) {
  17. throw new RuntimeException();
  18. }
  19. E res = nextElem;
  20. if (hasNext()) {
  21. nextElem = iter.next();
  22. hasNextElem = true;
  23. } else {
  24. hasNextElem = false;
  25. }
  26. return res;
  27. }
  28. @Override
  29. public boolean hasNext() {
  30. return hasNextElem;
  31. }
  32. }

答案1

得分: 4

E 是一个标识符。如果你声明 class PeekingIterator&lt;E&gt; implements Iterator&lt;E&gt;,编译器就知道这个标识符是一个泛型类型参数。

这使你能够实例化 PeekingIterator 如下:

  1. PeekingIterator&lt;Integer&gt; it1 = new PeekingIterator&lt;&gt;();

或者

  1. PeekingIterator&lt;String&gt; it2 = new PeekingIterator&lt;&gt;();

也就是说,你的 PeekingIterator 类可以迭代任何类型的元素。

如果你将 PeekingIterator 声明为 class PeekingIterator implements Iterator&lt;E&gt;,编译器会查找名为 E 的某种类型(类或接口)。如果找不到,就会导致编译错误。

如果你将 class PeekingIterator implements Iterator&lt;Integer&gt; 这样声明,这是有效的,因为 Integer 是一个类。这会限制你的 PeekingIterator 始终只能迭代 Integer 元素。

英文:

E is an identifier. If you say that class PeekingIterator&lt;E&gt; implements Iterator&lt;E&gt;, the compiler knows that this identifier is a generic type parameter.

This allows you to instantiate PeekingIterator as:

  1. PeekingIterator&lt;Integer&gt; it1 = new PeekingIterator&lt;&gt;();

or

  1. PeekingIterator&lt;String&gt; it2 = new PeekingIterator&lt;&gt;();

i.e. your PeekingIterator class can iterate over any type of elements.

If you declare PeekingIterator as class PeekingIterator implements Iterator&lt;E&gt;, the compiler searches for some type (class or interface) named E. If it doesn't find it, that's a compilation error.

If you declare class PeekingIterator implements Iterator&lt;Integer&gt;, this works, since Integer is a class. This limits your PeekingIterator to always iterate over Integer elements.

huangapple
  • 本文由 发表于 2020年10月7日 12:45:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/64237357.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定