Java 使用其他方法实现接口



我有一个实现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();时 它只知道diIterator<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();

最新更新