Jörn Kottmann wrote: > > On Aug 7, 2009, at 8:57 PM, Marshall Schor wrote: > >> getViewIterator in CASImpl is written with the signature: >> Iterator<CAS> getViewIterator() >> >> If you are working with things needing CASImpl objects, you would write: >> >> Iterator<CAS> s = aCas.getViewIterator(); >> while (s.hasNext()) { >> CASImpl ci = (CASImpl) s.next(); >> ... code using ci... >> } >> >> If we changed the signature to: >> Iterator<T extends CAS> getViewIterator() >> then you would write: >> Iterator<CASImpl> s = aCas.getViewIterator(); // cast done inside the >> support code, not here >> while (s.hasNext()) { >> CASImpl ci = s.next(); // works OK without casting >> ... code using ci... >> } >> >> Would it be better to have that form of the signature? > > +1, though did not know that its possible, we should check other > places too
+1 to checking other places :-) The tutorial on generics by Gilad Bracha, http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf, on page 20 near the top says: > In general, if you have an API that only uses a type parameter T as an > argument, its > uses should take advantage of lower bounded wildcards (? super T). > Conversely, if > the API only returns T, you’ll give your clients more flexibility by > using upper bounded > wildcards (? extends T). There are many cases I think in our generification where the 2nd part of this, returning XXX<? extends T> or a variant, is a better choice. -Marshall > > > Jörn > > >