JAVA:嵌套在迭代器中 public class

JAVA: Nesting in Iterator in a public class

所以对于一个学校项目,我需要制作一个实现 Iterator 接口的私有方法。我有我的方法 SetIterator,它看起来像这样:

  private class SetIterator implements Iterator<T> {
  private T[] items; 
  private int count; 
  private int current; 

  private SetIterator(T[] elements, int size) {
     items = elements;
     count = size;
     current = 0;
  }

  private boolean hasNext() {
     return (current < count);
  }

  private T next() {
     if (!hasNext()) {
        throw new NoSuchElementException();
     }

     return items[current++];
  }

但是,我无法编译,因为我收到以下错误消息:

ArraySet.java:311: error: next() in ArraySet.SetIterator cannot implement next() in Iterator
  private T next() {
            ^
attempting to assign weaker access privileges; was public
where T,E are type-variables:
T extends Comparable<? super T> declared in class ArraySet
E extends Object declared in interface Iterator
ArraySet.java:307: error: hasNext() in ArraySet.SetIterator cannot implement hasNext() in Iterator
private boolean hasNext() {
                  ^
attempting to assign weaker access privileges; was public

我以前从未真正 运行 参与过这个,所以任何帮助将不胜感激。

迭代器是一个接口。因此,它的方法是public。您不能实现该方法并将其设为私有。

将可见性更改为 public

public boolean hasNext() {
  return (current < count);
}

该错误很容易解释:nexthasNextIterator 中的 public,因此您不能将它们设为私有。将 private 更改为 public,错误应该会消失。

您收到此错误的原因是您无法将 "weaker" 特权分配给从超级 class 覆盖或从接口实现的方法。

由于在 Java 中的接口上定义的方法默认为 public,Java 编译器阻止我们使用较弱的访问权限实现这些方法,例如 protectedprivate。它这样做的原因是因为面向对象编程的内在原则 - subclass 的实例通常应该在其 super class 的实例被期望的地方使用(检查 Liskov Substitution Principle 以更好地理解这个概念)。

综上所述,将SetIteratorhasNext()next()方法声明为public,因为它们实现了Iterator接口的方法。

如果您知道 Overrding inr Java 的规则,就不会遇到此问题。

尝试 google 覆盖 Java 中的规则。从这里开始: http://java67.blogspot.com/2012/09/what-is-rules-of-overloading-and-overriding-in-java.html

永远记住经验法则:永远不要缩小方法的范围,您总是可以在覆盖它的同时增加方法的范围,但永远不能缩小它。