There seems to be no perfect way to do this, so I suggest two suboptimal solutions.
The first is a wrapper iterator:
public class SuperTypeIterator<E> implements Iterator<E> { private final Iterator<? extends E> iter; public SuperTypeIterator(Iterator<? extends E> iter) { this.iter = iter; } @Override public E next() { return iter.next(); }
This allows you to change the type of the return value as follows:
Iterator<Plant> getPlantIterator() { return new SuperTypeIterator<Plant>( new MapleIterator() ); }
This ensures complete type safety by creating a new object.
An alternative is to use an unchecked list:
Iterator<Plant> getPlantIterator() { return (Iterator<Plant>) (Iterator<?>) new MapleIterator();
This eliminates the need to create a wrapper object, but at the expense of security of all types.
Dan R.
source share