Re: forEach and Casting
Jason Cavett wrote:
Currently, the collection I'm using an Iterator over contains objects
of a Generic type (an abstract class). When I get the object from the
collection, I must cast it to the more specific type so I can use the
various methods. There is no way to change this.
I suggest you really make sure whether you can change it or not. If you
are using generics, casts often mean design issues.
// this is the part I'm not sure about - can I even do something like
this?
for(Specific o : (Specific) genericCollection) {
You can quite easily make a "safe" casting iterator.
/**
* <strong>{see Iterator#next}
* will throw ClassCastException...</strong>
*/
public static <T> Iterable<T> castIterable(
final Class<T> clazz, final Iterable<? super T> iterable
) {
return new Iterable<T>() {
public java.util.Iterator<T> iterator() {
return new java.util.Iterator<T>() {
private final java.util.Iterator<? super T> target =
iterable.iterator();
public boolean hasNext() {
return target.hasNext();
}
public T next() {
return clazz.cast(target.next());
}
public void remove() {
target.remove();
}
};
}
};
}
....
for (Specific thing : castIterable(Specific.class, generals)) {
(Disclaimer: Not tested.)
Tom Hawtin