Benutzerdefinierte Java-Iterator mit Typ-Verwirrung
Habe ich eine generische Klasse, die bundles, die ein Objekt und ein Auftrag:
public class OrderedObject<T> {
private int order;
private T object;
public OrderedObject(int order, T object) {
this.order = order;
this.object = object;
}
public int getOrder() {
return order;
}
public T getObject() {
return object;
}
}
Entwickelte ich eine Set
Umsetzung die Geschäfte OrderedObject<T>
Instanzen und herstellen möchte, eine Iterator<T>
Aufzählung in der Reihenfolge erzwungen durch die gebaut-in der Reihenfolge:
public class OrderedObjectSet<T> extends AbstractSet<T> implements Set<T> {
Set<OrderedObject<T>> s = new HashSet<OrderedObject<T>>();
public boolean add(int order, T object) {
return s.add(new OrderedObject<T>(order, object));
}
public Iterator<T> iterator() {
return new OrderedObjectSetIterator<T>();
}
public int size() {
return s.size();
}
private class OrderedObjectSetIterator<T> implements Iterator<T> {
private int index;
public boolean hasNext() {
return index < s.size();
}
public T next() {
T object = null;
for (Iterator<OrderedObject<T>> it = s.iterator(); it.hasNext(); ) {
OrderedObject<T> o = it.next();
if (o.getOrder() == index) {
object = o.getObject();
}
}
index++;
return object;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}
Letztere Klasse nicht kompilieren, weil es scheint einige Verwirrung in der Arten in der Iterator
Initialisierung bei
for (Iterator<OrderedObject<T>> it = s.iterator(); it.hasNext(); ) {
Mache ich was übersehen?
- Sie sind sich bewusst
TreeSet
, richtig? - Hmmm... wirkt sich das hinzufügen einer public no-arg-Konstruktor OrderedObjectSetIterator<T> das problem lösen? Da werde ich misstrauisch, wenn ich sehe keine expliziten Konstruktoren.
- Wie auch immer, ich habe nicht ein compiler praktisch, aber was passiert, wenn Sie definieren die innere Klasse als
private class OrderedObjectSetIterator implements Iterator<T>
? Ich denke, dieT
werden immer neu definiert es. - ausbauen mmyers Kommentar, wenn Sie TreeSet und definieren compareTo() mit Ihrem OrderedObject zu verwenden, um Feld, bekommt man Iteratoren, die effizienter sind kostenlos....
- Und ohne schreiben alle, dass möglicherweise-fehlerhafte code.
- Das sollte keinen Unterschied machen, weil a) der Konstruktor hat nichts mit der Leitung zu tun, dass der Fehler passiert, und b) die Standard no-arg-Konstruktor, wird automatisch vom compiler sowieso.
- TreeSet mit benutzerdefinierten Komparator ist ein eleganter Ansatz. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Verwirrung ist, weil die innere Klasse
OrderedObjectSetIterator
stellt einen generischen Typ als die gleiche (T
), wie die äußere Klasse. Eclipse IDE, gibt es eine Warnung:So, ich denke, Sie brauchen nicht vorstellen, einen anderen parameter-Typ, verwenden Sie einfach die gleiche wie die äußeren Klasse definiert.
Grundsätzlich, die innere Klasse definiert werden als:
- Und der iterator-Methode als: