2015-08-31 10 views
6

Di seguito si riporta la classe padre DblyLinkListCome ereditare la classe interna del genitore in questo codice?

package JavaCollections.list; 

import java.util.Iterator; 
import java.util.NoSuchElementException; 

public class DblyLinkList<T> implements Iterable<T>{ 

    class DListNode<T> { 

     private T item; 
     private DListNode<T> prev; 
     private DListNode<T> next; 

     DListNode(T item, DListNode<T> p, DListNode<T> n) { 
      this.item = item; 
      this.prev = p; 
      this.next = n; 
     } 


    } 
..... 
} 

Di seguito la classe derivata LockableList,

package JavaCollections.list; 

    import JavaCollections.list.DblyLinkList.DListNode; 

    public class LockableList<T> extends DblyLinkList<T> { 

     class LockableNode<T> extends DblyLinkList<T>.DListNode<T> { 

      /** 
      * lock the node during creation of a node. 
      */ 
      private boolean lock; 

      LockableNode(T item, DblyLinkList<T>.DListNode<T> p, 
        DblyLinkList<T>.DListNode<T> n) { 
       super(item, p, n); // this does not work 
       this.lock = false; 
      } 

     } 

     LockableNode<T> newNode(T item, DListNode<T> prev, DListNode<T> next) { 
      return new LockableNode(item, prev, next); 
     } 

     public LockableList() { 
      this.sentinel = this.newNode(null, this.sentinel, this.sentinel); 
     } 


    ..... 
} 

Se class LockableNode<T> extends DListNode<T> nel codice qui sopra, errore: The constructor DblyLinkList<T>.DListNode<T>(T, DblyLinkList<T>.DListNode<T>, DblyLinkList<T>.DListNode<T>) is undefined si verifica in linea super(item, p, n)

Questo l'errore viene risolto dicendo: class LockableNode<T> extends DblyLinkList<T>.DListNode<T>

Come si riconosce questo errore? Perché è stato risolto?

+0

Provare a rendere il 'DListNode' protetto:' classe protetta DListNode {...} ' –

+0

Does' this (item, p, n); 'funziona, invece di' super'? – Craig

+0

@NicholasRobinson Non è questo il problema, perché se questo fosse il caso, il messaggio di errore sarebbe diverso. Nota anche che sono nello stesso pacchetto, quindi non è sicuramente un problema di visibilità. – m0skit0

risposta

5

Si sta redecando la variabile di tipo T nella classe interna. Ciò significa che all'interno della classe interna, lo T della classe esterna è nascosto e non può più essere indicato.

Dal momento che si dispone di una classe interna non statica, si può semplicemente rimuovere il tipo di variabile T lì:

class DListNode { ... } 

perché eredita dalla classe che contiene (e probabilmente significa che le variabili sono gli stessi , Comunque).

+0

Scusa se non ti ho preso. 'classe DListNode implementa Iterable {..}' o 'classe DListNode {..}' – overexchange

+0

Mi spiace, intendevo 'DListNode', che non implementa' Iterable '. – Hoopje

+0

Se si vede 'java.util.Map ', si ha 'voce ' come 'interfaccia interna'. Quindi, perché non posso rendere 'DListNode ' invece di 'DListNode'? – overexchange

Problemi correlati