Generics problem with iterator... (I am a generics noob)
Hello. G-noob here.
I have created a Set class which implements java.lang.Iterable and uses generics to specify what type of element it will accept. However the accompanying Iterator does not seem to work as I expected. I know I am missing something in the use of generics... but I don't know where. For instance (the example I use in the code below), if I create a Set<Integer> object named someSet, and try to iterate through it with a foreach loop, I am not allowed to assume that the elements of the set are Integer objects. That is, I must use for(Object i : someSet) instead of for(Integer i : someSet).
What am I doing wrong? It seems to me that Set.Iterator.next() should return an object of type E, not of type Object. Thank you very much for any help and suggestions.
Here is my code. The main method is at the bottom.
import java.util.NoSuchElementException;
publicclass Set<Eextends Object>implements Iterable{
private Position head;
privateint size;
publicboolean isEmpty(){return head ==null;}
publicboolean contains(E element){return getPosition(element) !=null;}
public Set.Iterator iterator(){returnnew Set.Iterator(head);}
private Position getPosition(Object element){
PositionIterator positions =new PositionIterator(head);
Position current;
while (positions.hasNext()){
current = (Position)positions.next();
if (current.element == element)return current;
}
returnnull;
}
publicvoid add(E element){
if (!contains(element)){
if (isEmpty()) head =new Position(element);
else head.prev = head.prev.next =new Position(element, head.prev, head);
size++;
}
}
publicvoid remove(E element){
if (contains(element)){
if (size == 1) head =null;
else{
Position remove = getPosition(element);
if (remove == head) head = head.next;
remove.prev.next = remove.next;
remove.next.prev = remove.prev;
remove.prev = remove.next =null;
}
size--;
}
}
privateclass Position{
private E element;
private Position prev, next;
public Position(E element){
this.element = element;
prev =this;
next =this;
}
public Position(E element, Position prev, Position next){
this.element = element;
this.prev = prev;
this.next = next;
}
}
class Iteratorextends PositionIterator{
public Iterator(Position start){super(start);}
public E next(){return ((Position)super.next()).element;}
}
privateclass PositionIteratorimplements java.util.Iterator{
private Position current;
private Position start;
privateboolean started;
private PositionIterator(Position start){
this.start = start;
current = start;
started =false;
}
publicboolean hasNext(){return !(start ==null || (started && current == start));}
public Object next(){
if (hasNext()){
Position temp = current;
current = current.next;
started =true;
return temp;
}
elsethrownew NoSuchElementException("No more elements");
}
publicvoid remove(){thrownew UnsupportedOperationException("Cannot remove Set elements via an Iterator.");}
}
publicstaticvoid main(String[] args){
Set<Integer> s =new Set<Integer>();
s.add(3);
s.add(19);
s.add(7);
// This works:
for (Object i : s) System.out.print(i +"; ");
// But this does not:
//for (Integer i : s) System.out.print(i + "; ");
}
}

