2011-06-15 1 views
0

Iterator<E> 인터페이스를 구현하는 클래스 MyDoublyIterator<E>이 있습니다. 또한 인터페이스의 일부가 아닌 몇 가지 다른 방법이 있습니다 (예 : public void boolean hasPrev()). 내 메인 클래스에서 그 메소드를 호출하려고하면 IDE는 그 메소드를 해결할 수 없다. 여기 그래서 내 질문에 왜 그 방법을 찾을 수없는 추측 내가자바가 추가 메서드를 사용하여 인터페이스를 구현합니다.

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

전화를 사용하고 코드입니다. 인터페이스를 구현하고 확장하는 추상 클래스를 구축해야합니까? hasPrev() 같은 추가 방법과 DoubleIterator<E> 다음 클래스 MyDoublyIterator<E>에서 새로 만든 인터페이스 DoubleIterator<E>를 구현 :

+0

당신은'반복자 가'양방향 반복자를 제공하는 것을 알고 있습니까? – c00kiemon5ter

+0

나는 그것을 알지 못했다. 그러나 나는 어느 방법 으로든 나는 단지 배우려고 실험하고있다. – jhlu87

답변

2

문제는 di 변수가 Iterator 유형 인 것이 문제입니다. 따라서이 인터페이스의 모든 구현을 포함 할 수 있습니다. 따라서 IDE에는 MyDoublyIterator 인스턴스가 포함되어 있는지 확인할 수 없습니다. 따라서 요청한대로 작동하게하려면 변수 유형을 MyDoublyIterator로 변경해야합니다.

1

먼저 자신의 인터페이스 등으로 원래의 인터페이스 Iterator<E>를 확장하는 것이 좋습니다.

그렇지 않으면이 같은 클래스를 인스턴스화 할 수 있습니다 : 당신이 MyDoublyIterator<E>의 유형을 생성하기 때문에

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

그런 다음 컴파일러는 불평하지 않습니다.

1

컴파일러가 di.hasPrev();을 볼 때 diIterator<String>이라는 것을 알고 있으며 자신의 유형이라는 것을 알지 못합니다. 따라서 사용자 정의 방법을 알지 못합니다.

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

도움이되지 않습니다. 컴파일러는 내장 인터페이스 Iterator 인터페이스가 아니라 해당 메소드가 자신의 인터페이스에 있음을 알 수있는 방법이 필요합니다. 즉 Iterator<String>입니다. 여기서 내장 Iterator 인터페이스에 대한 참조를 생성합니다 (예 : Iterator<String>). 당신이이 것을 알고 있기 때문에,

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

를 한 다음 메서드 호출을 해결할 수 : 당신이 당신의 자신의 인터페이스 MyDoublyIterator<E>라는 이름이이 인터페이스라는 방법이있는 경우

따라서, hasPrev(); 당신은이 작업을 수행 할 필요가 자신의 MyDoubleInterface<T>에 대한 참조를 만들었으므로 이제 문제가 해결됩니다. :-)

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();