Générique Itérateur mise en œuvre en java
J'ai le dessin suivant:
J'ai une classe Abstraite Instance
,
J'ai une classe Library
qui s'étend Instance
et
J'ai une classe File
qui s'étend également Instance
J'ai créé ma propre liste liée de mise en œuvre et il est défini comme suit:
public class List<T extends Instance> implements Iterable {
//some other code here
public Iterator iterator(){
return new ListIterator(this);
}
maintenant, j'ai créé une classe
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;
}
}
Où Node
est
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;
}
}
donc mon problème est comme suit: la ligne de retour temp.les données se lève une erreur:
Incompatibilité de Type - impossible de convertir de l'Instance de T.
Quel est le problème avec ce code?
Il sera plus facile de comprendre ce qui se passe si vous affichez le code de la classe de Nœud. Aussi... ce n'est pas... devoirs, est-il?
ce n'est pas de devoirs, pourquoi?
Parce que (1) si ce n'est pas les devoirs à la maison (ou au moins, d'étude privée), alors c'est probablement une mauvaise idée de mettre en place la Liste vous-même, et (2) si ont été pour les devoirs alors nous devrions être en vous aidant à apprendre à partir de l'erreur, plutôt que de vous donner la réponse dans une boîte.
Btw, si vous utilisez un IDE comme Eclipse, IntelliJ, etc, activez l'option pour vous avertir lorsque vous êtes à l'aide de matières plutôt les types de génériques. Elle vous donne un supplément de pointeur avec ce genre de problème. (Bien que si vous obtenez fortement dans les génériques, vous pourrez également venir à travers des mises en garde, vous ne pouvez pas vous débarrasser de. Les génériques sont une douleur.)
Une astuce de plus - alors, je vais arrêter de t'énerve lire Josh Bloch Effectif de Java, qui contient un élément d'explication (bien plus éloquente que j'ai pu) pourquoi vous ne devriez pas être la rédaction de votre propre Liste, sauf comme un exercice d'apprentissage, bien sûr. Josh Bloch, par ailleurs, a été l'un des ingénieurs qui a écrit en Java Collections de l'API.
ce n'est pas de devoirs, pourquoi?
Parce que (1) si ce n'est pas les devoirs à la maison (ou au moins, d'étude privée), alors c'est probablement une mauvaise idée de mettre en place la Liste vous-même, et (2) si ont été pour les devoirs alors nous devrions être en vous aidant à apprendre à partir de l'erreur, plutôt que de vous donner la réponse dans une boîte.
Btw, si vous utilisez un IDE comme Eclipse, IntelliJ, etc, activez l'option pour vous avertir lorsque vous êtes à l'aide de matières plutôt les types de génériques. Elle vous donne un supplément de pointeur avec ce genre de problème. (Bien que si vous obtenez fortement dans les génériques, vous pourrez également venir à travers des mises en garde, vous ne pouvez pas vous débarrasser de. Les génériques sont une douleur.)
Une astuce de plus - alors, je vais arrêter de t'énerve lire Josh Bloch Effectif de Java, qui contient un élément d'explication (bien plus éloquente que j'ai pu) pourquoi vous ne devriez pas être la rédaction de votre propre Liste, sauf comme un exercice d'apprentissage, bien sûr. Josh Bloch, par ailleurs, a été l'un des ingénieurs qui a écrit en Java Collections de l'API.
OriginalL'auteur mary | 2011-12-15
Vous devez vous connecter pour publier un commentaire.
Je dirais que
Node.data
est une référence à unInstance
objet? Si c'est le cas, le compilateur ne peut pas changer automatiquement unInstance
à unT
, parce que même siT
est unInstance
objet (T extends Instance
), toutInstance
peut-être pas uneT
.Les Generics de Java tutoriel explique: http://docs.oracle.com/javase/tutorial/extra/generics/subtype.html
Aussi, dans votre
List<T>
classe, vous devriez être en spécifiantIterator
etListIterator
comme générique à l'aide deIterator<T>
etListIterator<T>
, sinon le compilateur ne pas être en mesure de gérer les génériques correctement. VotreNode
de référence doit également être générique:Node<T>
Par conséquent, vous devriez être en utilisant
et
Le compilateur va généralement de vous avertir lorsque vous êtes à l'aide d'une crue de type pour une classe générique.
J'ai mis à jour ma réponse: vous devez spécifier un Noeud comme Noeud<T> sinon, il sera considéré comme non typé (et est donc de type, par Exemple, pas de T)
Merci! Il wroked!
Je pense que c'est la réponse que l'OP voulait. La mienne avait été volontairement prosaïques.
OriginalL'auteur Gnat
N'a pas un avis, le bug:
C'est un invariant. À moins que quelque chose m'échappe, l'itérateur sera très vite de retour 0 éléments!
OriginalL'auteur Andrew Dennison