2015-04-25 9 views
5

Provare a creare un iteratore per un elenco collegato generico. Quando provo a creare un nodo "corrente" allo scopo di scorrere l'elenco basato sulla sentinella principale, ottengo un errore di tipo incompatibile. Ecco le linee relveantTipi non compatibili di Java Generatori di linker iterators

public class LinkedList<T> implements Iterable<T> 
{ 
    private node<T> headsent; 
    private node<T> tailsent; 
    public DistanceEventList() 
    { 
     headsent = new node<T>(); 
     tailsent = new node<T>(); 
     headsent.setnext(tailsent); 
     tailsent.setprevious(headsent); 
    } 
    public node<T> getheadsent() 
    { 
     return headsent; 
    } 
    ... 
    public MyIterator<T> iterator() { 
     return new MyIterator<T>(); 
    } 
    public class MyIterator<T> implements Iterator<T> 
    { 
     private node<T> current = getheadsent(); 
     public T next() { 
      current = current.getnext(); 
      return current.getdata(); 
     } 
    private class node<T> { 
     private T data; 
     private node<T> next; 
     private node<T> previous;  
     ... 
     public node<T> getnext() 
     { 
      return next; 
     } 
    } 
} 

E l'errore prodotto

LinkedList.java:65: error: incompatible types 
private node<T> current = getheadsent(); 
required: LinkedList<T#1>.node<T#2) 
found: LinkedList<T#1>.node<T#1) 

Sembra che io ho introdotto due diversi tipi di T, ma io non sono molto esperto con i generici per sapere con certezza. Si spera che il codice sopra sia sufficiente per identificare l'errore (è abbastanza distrutto). Grazie!

risposta

5

Si hanno due tipi con lo stesso nome.

Le classi interne condividono variabili di tipo dichiarate nella loro classe esterna. Quindi, quando si dispone di

public class MyIterator<T> implements Iterator<T> 
//      ^^^ 

La nuova dichiarazione del tipo <T> ombre quello esterno.

private node<T> current = getheadsent(); 
//  ^^^^^^^   ^^^^^^^^^^^ 
//  inner T    outer T 

Si può solo cancellare la dichiarazione:

public class MyIterator implements Iterator<T> 
//     ^^^ 
+0

Ah vedo, che spiega anche il motivo per cui il mio IDE stava elencando LinkedList LinkedList come . Significa anche che il nodo di classe privata {} dovrebbe essere solo un nodo chiuso privato {}? – Matt

+0

* "Significa anche che il nodo di classe privata {} dovrebbe essere solo nodo di chiusura privata {}" * Sì, o 'nodo di classe statica privata ' potrebbe essere più appropriato se non è effettivamente necessario fare riferimento all'oggetto esterno dall'interno del nodo. – Radiodef