我有一个实现Iterator<E>
接口的类MyDoublyIterator<E>
。此外,它还有几个不属于接口的其他方法(例如 public void boolean hasPrev()
(。当我尝试在主类中调用该方法时,我的 IDE 无法解析该方法。这是我用来调用它的代码
Iterator<String> di = new MyDoublyIterator<String>();
di.hasPrev();
所以我想我的问题为什么它找不到这种方法。我是否必须构建一个实现接口并扩展它的抽象类?
问题是 di-变量的类型是迭代器。因此,它可以包含此接口的任何实现。因此,IDE 无法确定它是否包含 MyDoublyIterator 的实例。因此,要使其按照您的要求工作,您必须将变量的类型更改为MyDoublyIterator。
最好先用自己的接口扩展原始接口Iterator<E>
,例如:DoubleIterator<E>
使用hasPrev()
等其他方法,然后在类MyDoublyIterator<E>
中实现新创建的接口DoubleIterator<E>
。
否则,您可以像这样实例化您的类:
MyDoublyIterator<String> di = new MyDoublyIterator<String>();
di.hasPrev();
然后编译器不会抱怨,因为您正在创建一种MyDoublyIterator<E>
。
当编译器看到di.hasPrev();
时 它只知道di
是Iterator<String>
的,并且不知道它是您自己的类型。因此,它不知道您的自定义方法。
Iterator<String> di = new MyDoublyIterator<String>();
di.hasPrev();
它不会帮助你。编译器需要一种方法来知道您自己的接口具有该方法,而不是内置接口迭代器接口即Iterator<String>
。 在这里,您正在为内置迭代器接口创建引用,即Iterator<String>
.
因此,如果您有自己的名为 MyDoublyIterator<E>
的接口,并且此接口具有名为 hasPrev();
的方法,则需要执行此操作:
MyDoublyInterface<String> di = new MyDoublyIterator<String>();
di.hasPrev();
然后它将解决方法调用,因为它知道您已经创建了自己MyDoubleInterface<T>
的引用,并且现在应该解决问题。
其他答案是正确的,但这是另一个旋转 - 创建一个extends
迭代器的接口:
interface DoublyIterator<E> extends Iterator<E> {
boolean hasPrev();
}
class MyDoublyIterator<E> implements DoublyIterator<E> {
// ... implement methods
}
DoublyIterator<String> di = new MyDoublyIterator<String>();
di.hasPrev();