2011-06-15 55 views
0

我有一个类MyDoublyIterator<E>,实现了Iterator<E>接口。此外,它还有一些其他方法不是界面的一部分(例如public void boolean hasPrev())。当我尝试在我的主类中调用该方法时,我的IDE无法解析该方法。 下面是我使用叫它java实现与其他方法的接口

Iterator<String> di = new MyDoublyIterator<String>(); 
di.hasPrev(); 

的代码,所以我想我的问题为什么就不能找到方法。我是否必须构建一个实现接口并将其扩展的抽象类?

+0

你知道的ListIterator''提供了一个双向迭代器,对不对? – c00kiemon5ter 2011-06-15 01:09:21

+0

我不知道,但无论哪种方式,我只是试验学习。 – jhlu87 2011-06-15 01:11:05

回答

2

问题是,di变量是类型迭代器。所以它可以包含这个接口的任何实现。因此IDE不能确定它包含MyDoublyIterator的实例。所以为了使它像你所要求的那样工作,你必须将变量的类型改为MyDoublyIterator。

1

最好是先用自己的接口,例如延长原接口Iterator<E>DoubleIterator<E>与像hasPrev()额外的方法,然后实现在MyDoublyIterator<E>类的新创建的接口DoubleIterator<E>

否则,你可以实例类是这样的:

MyDoublyIterator<String> di = new MyDoublyIterator<String>(); 
di.hasPrev(); 

那么编译器不会抱怨,因为你正在创建一个类型的MyDoublyIterator<E>

1

当编译器看到di.hasPrev();它只知道diIterator<String>并且不知道它是你自己的类型。所以它不知道你的自定义方法。

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>,它现在应该可以解决问题。 :-)

0

其他的答案是正确的,但这里的另一个自旋 - 创建extends的Iterator接口:

interface DoublyIterator<E> extends Iterator<E> { 
    boolean hasPrev(); 
} 

class MyDoublyIterator<E> implements DoublyIterator<E> { 
    // ... implement methods 
} 

DoublyIterator<String> di = new MyDoublyIterator<String>(); 
di.hasPrev();