I don't understand the connection between generics and arrays.
I can create array reference with generic type:
private E[] elements; //GOOD
But can't create array object with generic type:
elements = new E[10]; //ERROR
But it works:
elements = (E[]) new Object[10]; //GOOD
checked :
public Constructor(Class<E> c, int length) {
elements = (E[]) Array.newInstance(c, length);
}
or unchecked :
public Constructor(int s) {
elements = new Object[s];
}
Problem is that while runtime generic type is erased so new E[10]
would be equivalent to new Object[10]
.
This would be dangerous because it would be possible to put in array other data than of E
type. That is why you need to explicitly say that type you want by either
E[]
array, or componentType
argiment.Here is the implementation of LinkedList<T>#toArray(T[])
:
public <T> T[] toArray(T[] a) {
if (a.length < size)
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), size);
int i = 0;
Object[] result = a;
for (Node<E> x = first; x != null; x = x.next)
result[i++] = x.item;
if (a.length > size)
a[size] = null;
return a;
}
In short, you could only create generic arrays through Array.newInstance(Class, int)
where int
is the size of the array.
Source: Stackoverflow.com