Re: Cannot create a generic array of <type>
Warren Tang wrote:
The following code:
ArrayList<Integer>[] indexedValues = new ArrayList<Integer>[5];
generates an error:
Cannot create a generic array of ArrayList<Integer>
Could someone explain this to me?
Sure. The short answer is that generics and arrays do not mix. Slightly l=
onger, the Java Language Specification explicitly forbids arrays of non-rei=
fiable types:
"An array creation expression specifies the element type, the number of lev=
els of nested arrays, and the length of the array for at least one of the l=
evels of nesting. ... It is a compile-time error if the element type is not=
a reifiable type".
<http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.3>
Generic types like 'ArrayList<Integer>' are not reifiable, that is, you can=
not actually create such a type at runtime due to type erasure.
The longer answer is that arrays are reifiable, therefore their element typ=
es must also be reifiable. Unlike generics, arrays carry their base type w=
ith them at run time - they "know" their type. Generic types do not. (You=
can get around this with a run-time type token, or RTTT, but that's a topi=
c for another discussion.) So when you try to make an array of a generic t=
ype you deprive the array of information it needs. This the compiler won't=
allow.
Back to the short answer: don't mix arrays and generics. There are a few c=
onversion classes in the Collections framework that let you convert between=
them, but use them sparingly and usually to go from array-land to collecti=
ons-land to stay.
Arrays.asList
static <T> List<T> asList(T... a)
<http://download.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList(=
T...)>
--
Lew