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