Click to See Complete Forum and Search --> : generic, stuck


xusword
April 28th, 2008, 07:52 PM
I have problem in the following code:

It is a code to parse a tree node with any number of childs


// generate a collection to hold the children
Collection<TreeNode<String>> children = new ArrayList<TreeNode<String>>();

while (has more child){
children.add(parse the child...);
}

createNode(...);


Now there is a problem, createNode takes an array if TreeNode<String> instead of collection.
Now I am stuck between array and collection
toArray returns Object[] which i cannot cast to TreeNode<String>[]
I also cannot create a new TreeNode<String> array and copy the values into the array (ie: TreeNode<String>[] nodes = new TreeNode<String>[size]; does not work)

What can I do here?

spoon!
April 28th, 2008, 10:09 PM
see my answer on the Sun forums
http://forum.java.sun.com/thread.jspa?messageID=10227955

xusword
April 28th, 2008, 10:11 PM
thanks

but I am still curious

toArray returns Object[]
is there any way to cast the array back to whatever type it should be?

bobtheclown
April 29th, 2008, 03:26 AM
Try...

TreeNode<String> [] foo = children.toArray(new TreeNode<String> [1]);

From the API...

<T> T[] toArray(T[] a)

Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array. If the collection fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this collection.

If this collection fits in the specified array with room to spare (i.e., the array has more elements than this collection), the element in the array immediately following the end of the collection is set to null. This is useful in determining the length of this collection only if the caller knows that this collection does not contain any null elements.)

If this collection makes any guarantees as to what order its elements are returned by its iterator, this method must return the elements in the same order.

Like the toArray method, this method acts as bridge between array-based and collection-based APIs. Further, this method allows precise control over the runtime type of the output array, and may, under certain circumstances, be used to save allocation costs

Suppose l is a List known to contain only strings. The following code can be used to dump the list into a newly allocated array of String:

String[] x = (String[]) v.toArray(new String[0]);


Note that toArray(new Object[0]) is identical in function to toArray().

Parameters:
a - the array into which the elements of this collection are to be stored, if it is big enough; otherwise, a new array of the same runtime type is allocated for this purpose.
Returns:
an array containing the elements of this collection
Throws:
ArrayStoreException - the runtime type of the specified array is not a supertype of the runtime type of every element in this collection.
NullPointerException - if the specified array is null.

xusword
April 29th, 2008, 06:55 PM
thanks
cant believe I missed that