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);
}
该错误很容易解释:next
和 hasNext
是 Iterator
中的 public,因此您不能将它们设为私有。将 private
更改为 public
,错误应该会消失。
您收到此错误的原因是您无法将 "weaker" 特权分配给从超级 class 覆盖或从接口实现的方法。
由于在 Java 中的接口上定义的方法默认为 public
,Java 编译器阻止我们使用较弱的访问权限实现这些方法,例如 protected
或 private
。它这样做的原因是因为面向对象编程的内在原则 - subclass 的实例通常应该在其 super class 的实例被期望的地方使用(检查 Liskov Substitution Principle 以更好地理解这个概念)。
综上所述,将SetIterator
的hasNext()
和next()
方法声明为public,因为它们实现了Iterator
接口的方法。
如果您知道 Overrding inr Java 的规则,就不会遇到此问题。
尝试 google 覆盖 Java 中的规则。从这里开始:
http://java67.blogspot.com/2012/09/what-is-rules-of-overloading-and-overriding-in-java.html
永远记住经验法则:永远不要缩小方法的范围,您总是可以在覆盖它的同时增加方法的范围,但永远不能缩小它。
所以对于一个学校项目,我需要制作一个实现 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);
}
该错误很容易解释:next
和 hasNext
是 Iterator
中的 public,因此您不能将它们设为私有。将 private
更改为 public
,错误应该会消失。
您收到此错误的原因是您无法将 "weaker" 特权分配给从超级 class 覆盖或从接口实现的方法。
由于在 Java 中的接口上定义的方法默认为 public
,Java 编译器阻止我们使用较弱的访问权限实现这些方法,例如 protected
或 private
。它这样做的原因是因为面向对象编程的内在原则 - subclass 的实例通常应该在其 super class 的实例被期望的地方使用(检查 Liskov Substitution Principle 以更好地理解这个概念)。
综上所述,将SetIterator
的hasNext()
和next()
方法声明为public,因为它们实现了Iterator
接口的方法。
如果您知道 Overrding inr Java 的规则,就不会遇到此问题。
尝试 google 覆盖 Java 中的规则。从这里开始: http://java67.blogspot.com/2012/09/what-is-rules-of-overloading-and-overriding-in-java.html
永远记住经验法则:永远不要缩小方法的范围,您总是可以在覆盖它的同时增加方法的范围,但永远不能缩小它。