2009-10-13 11 views
0

J'écris une classe pour un arbre binaire, et dans l'interface d'arbre cette fonction est définie:Arbre binaire Java qui renvoie le type pour l'itérateur sur les noeuds, l'interface ou la classe?

/** Returns an iterable collection of the the nodes. */ 
    public Iterable<Position<E>> positions(); 

Le problème est que le type du noeud est ma classe qui implémente l'interface de position dans la tâche. Pas l'interface elle-même, Position. C'est pourquoi j'ai du mal à retourner une liste itérable des nœuds.

@Override 
    public Iterable<Position<E>> positions() { 
     ArrayList<Posisjon<E>> liste = new ArrayList<Posisjon<E>>(); 
     liste = dumpings(liste,root); 
     System.out.println(liste.get(0)); 
     return (Iterable<Position<E>>) liste.Iterator(); //PROBLEM HERE! 
    } 

J'utilise une fonction d'aide récursif pour extraire les éléments et les ajouter à une liste de tableaux, puis il suffit de retourner l'itérateur pour la liste. "liste" ici est de type ma classe "Posisjon" et le retour attendu pour la fonction est l'interface "Position". Pourquoi ne puis-je pas simplement utiliser le type de retour "Posisjon" puisqu'il met en œuvre l'interface "Position"? Je ne peux pas non plus changer le type de retour car le type de retour est spécifié dans l'arborescence que je dois implémenter.

Voici l'interface "Position" et ma classe "Posisjon" au cas où cela vous aiderait à comprendre le problème. (Interface de noeud et classe de noeud si vous voulez).

public interface Position<E> { 
    /** Return the element stored at this position. */ 
    E element(); 
} 

public class Posisjon<E> implements Position<E> { 
    private E element; 
    private Posisjon<E> parenten; 
    private Posisjon<E> rightChildren; 
    private Posisjon<E> leftChildren; 
    @Override 
    public E element() { 
     return element; 
    } 
    public E setElement(E ting){ 
     E tmpElement = element; 
     this.element = ting; 
     return tmpElement; 
    } 
    public Posisjon<E> leftChild(){ 
     return leftChildren; 
    } 
    public Posisjon<E> rightChild(){ 
     return rightChildren; 
    } 
    public Posisjon<E> parent(){ 
     return parenten; 
    } 
    public Posisjon(E element){ 
     this.element = element; 
    } 
    public void setLeftChild(Posisjon<E> ting){ 
     this.leftChildren = ting; 
    } 
    public void setRightChild(Posisjon<E> ting){ 
     this.rightChildren = ting; 
    } 
} 

Répondre

1

Vous voulez

public Iterable<? extends Position<E>> positions(); 

Il y a very good reasons pourquoi Iterable<A> ne s'étend pas Iterable<B> lorsque A s'étend B. La solution en Java est d'utiliser des caractères génériques comme ci-dessus.

+0

Cela me demande de changer l'interface, et je ne suis pas autorisé à le faire. Si vous connaissez un autre moyen de le faire, en supposant qu'il doit y avoir un autre moyen puisque la tâche est définie comme ceci, ce serait appréciable. – Algific

+0

@data_jepp Je suppose que vous devriez implémenter Iterable/Iterator directement. Je peux essayer de trouver un exemple si nécessaire. Je remarque aussi que vous renvoyez un itérateur non itérable (ce qui serait la liste lui-même). –

0

Vous devez définir votre méthode comme:

public Iterable<? extends Position<E>> positions(); 
Questions connexes