Java реализации интерфейса с дополнительными методами - PullRequest
0 голосов
/ 15 июня 2011

У меня есть класс MyDoublyIterator<E>, который реализует интерфейс Iterator<E>. Кроме того, у него есть пара других методов, не являющихся частью интерфейса (например, public void boolean hasPrev()). Когда я пытаюсь вызвать этот метод в своем основном классе, моя среда IDE не может разрешить этот метод. Вот код, который я использую, чтобы назвать его

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

Так что я думаю, мой вопрос, почему он не может найти этот метод. Нужно ли создавать абстрактный класс, который реализует интерфейс и расширяет его?

Ответы [ 5 ]

2 голосов
/ 15 июня 2011

Проблема в том, что переменная типа d имеет тип Iterator. Таким образом, он может содержать любую реализацию этого интерфейса. И поэтому среда IDE не может быть уверена, что она содержит экземпляр MyDoublyIterator. Таким образом, чтобы все работало так, как вы просили, вам нужно изменить тип переменной на MyDoublyIterator.

1 голос
/ 15 июня 2011

Когда компилятор видит di.hasPrev(); Он знает только, что di равен Iterator<String> и не имеет ни малейшего представления, что это ваш собственный тип.Так что он не знает о ваших пользовательских методах.

1 голос
/ 15 июня 2011

Лучше сначала расширить исходный интерфейс Iterator<E> с помощью собственного интерфейса, например: DoubleIterator<E>, с помощью дополнительных методов, таких как hasPrev(), а затем реализовать вновь созданный интерфейс DoubleIterator<E> в своем классе MyDoublyIterator<E>.

В противном случае вы можете создать свой класс следующим образом:

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

Тогда компилятор не будет жаловаться, так как вы создаете тип MyDoublyIterator<E>.

0 голосов
/ 15 июня 2011

Другие ответы верны, но вот еще один вариант - создайте интерфейс, который 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();
0 голосов
/ 15 июня 2011
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> , и это должно решить проблему сейчас.: -)

...