Причина, по которой вы получаете эту ошибку, заключается в том, что компилятор делает то, что вы говорите, а не то, что вы имеете в виду.T
для ListIterator
и T
для RegLinkList
рассматриваются как два разных типа.Стало бы более понятным, если бы вы использовали, например, U
вместо T
.
. Решением вашей проблемы могло бы стать создание статических классов и передача элемента head
в конструктор.Таким образом, вы по-прежнему объявляете разные T
s, но поскольку вы передаете исходный элемент (и поэтому «сообщаете» компилятору, что один T
совпадает с другим), он будет счастлив.Следующий код успешно скомпилирован (я добавил недостающие реализации методов без функциональных возможностей):
import java.util.Iterator;
public class RegLinkList<T> implements Iterable<T> {
private Node<T> head;
public RegLinkList() {
head = null;
}
public static class Node<T> {
public Node<T> next = null;
public T data = null;
Node(T data) {
this.data = data;
}
}
public static class ListIterator<T> implements Iterator<T> {
Node<T> current;
Node<T> previous;
public ListIterator(Node<T> head) {
current = head;
previous = head;
}
@Override
public boolean hasNext() {
return false;
}
@Override
public T next() {
return null;
}
}
@Override
public Iterator<T> iterator() {
return new ListIterator<T>(head);
}
}