2011-12-15 6 views
3

я следующая конструкция: У меня есть абстрактный класс Instance, У меня есть класс, который расширяет LibraryInstance и У меня есть класс File, что также расширяет Instanceреализация Generic итератора в Java

я создал моя собственная реализация связного списка, и она определяется следующим образом:

public class List<T extends Instance> implements Iterable { 
    //some other code here 

    public Iterator iterator(){ 
     return new ListIterator(this); 

} 

теперь я создал класс

public class ListIterator<T extends Instance> implements Iterator<T> { 
    private List thisList; 
    private Node current; 

    public ListIterator(List l){ 
     thisList=l; 
     current=thisList.head.next; 
    } 
    @Override 
    public boolean hasNext() { 
     if(current==null) 
      return false; 
     return false; 
    } 

    @Override 
    public T next() { 
     Node temp=current; 
     current=current.next; 
     return temp.data; 
    } 
} 

Где Node является

public class Node<T extends Instance> { 
    public Node<T> next; 
    public Node<T> prev; 
    public T data; 

    public Node(T data,Node prev, Node next){ 
     this.data=data; 
     this.prev=prev; 
     this.next=next; 
    } 
} 

так что моя проблема заключается в следующем: обратная линия temp.data поднимается ошибка:

Type mismatch - cannot convert from Instance to T.

Что не так с этим кодом?

+0

Будет легче выяснить, что происходит, если вы публикуете код класса Node. Также ... это не ... _homework_, не так ли? –

+0

это не домашнее задание, почему? – mary

+1

Потому что (1) если это не домашнее задание (или, по крайней мере, частное исследование), то, вероятно, это плохая идея для реализации списка самостоятельно, и (2) если это было для домашней работы, мы должны помочь вам узнать об ошибке, вместо того, чтобы давать вам ответ в банке. –

ответ

4

Я бы сказал, что Node.data является ссылкой на объект Instance? Если это так, компилятор не может автоматически изменить Instance на T, потому что хотя T является объектом Instance (T extends Instance), любые данные Instance могут быть не T.

Java-Дженерики учебник объясняет: http://docs.oracle.com/javase/tutorial/extra/generics/subtype.html

Кроме того, в вашем List<T> класса, вы должны указать Iterator и ListIterator как родовое использованием Iterator<T> и ListIterator<T>, или иначе компилятор не сможет справиться с дженерики должным образом. Ваш Node ссылка также должен быть универсальным: Node<T>

Следовательно, вы должны использовать

private Node<T> current; 

и

public T next() { 
    Node<T> temp=current; 
    current=current.next; 
    return temp.data; 
} 

Компилятор обычно предупредит вас, когда вы используете необработанный тип для общий класс.

+0

Node.data имеет тип T и T extends Экземпляр – mary

+1

Я обновил свой ответ: вам нужно указать Node как Node , иначе он будет рассматриваться как нетипизированный (и, следовательно, имеет тип Instance, а не T) – Gnat

+0

Спасибо ! Он вздрогнул! – mary

0

сделал не одно уведомления ошибки:

public boolean hasNext() { 
    if(current==null) 
     return false; 
    return false; 
} 

Это инвариант. Если я что-то не хватает, итератор очень быстро вернет 0 элементов!

Смежные вопросы