Just for review, can someone quickly explain what prevents this from working (on compile):
private HashSet data; ... public DataObject[] getDataObjects( ) { return (DataObject[]) data.toArray(); }
…and what makes this the way that DOES work:
public DataObject[] getDataObjects( ) { return (DataObject[]) data.toArray( new DataObject[ Data.size() ] ); }
I’m not clear on the mechanism at work with casting (or whatever it is) that makes this so.
Because
toArray()creates an array of Object, and you can’t makeObject[]intoDataObject[]just by casting it.toArray(DataObject[])creates an array ofDataObject.And yes, it is a shortcoming of the Collections class and the way Generics were shoehorned into Java. You’d expect that
Collection<E>.toArray()could return an array of E, but it doesn’t.Interesting thing about the
toArray(DataObject[])call: you don’t have to make the ‘a’ array big enough, so you can call it withtoArray(new DataObject[0])if you like.Calling it like
toArray(new DateObject[0])is actually better if you use.lengthlater to get the array length. if the initial length was large and the same array object you passed was returned then you may faceNullPointerExceptions laterI asked a question earlier about Java generics, and was pointed to this FAQ that was very helpful: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html