Here's a question, this first code listing compiles just fine (JDK 1.6 | JDK 1.7):
ArrayList<String> a = new ArrayList<String>();
String[] s = a.toArray(new String[0]);
However, if I declare the List
reference as a raw type:
ArrayList a = new ArrayList();
String[] s = a.toArray(new String[0]);
I get a compiler error saying the String[]
is required but Object[]
was found.
This means my compiler is interpreting the generic method as returning Object[]
despite of receiving a String[]
as its argument.
I doubled-checked the toArray(myArray)
method signature:
<T> T[] toArray(T[] a);
Therefore it is a parameterized method whose type parameter <T>
has no relation whatsoever with that of the List (i.e. <E>
).
I have no idea how using a raw type here affects the evaluation of parameterized methods using independent type parameters.
- Does anyone has any idea why this code does not compile?
- Does anybody knows any reference where this behavior is documented?
(String[])a.toArray();
Since you're not using generics, casting is a must. – JinkArrayList<?> a = new ArrayList();
, the error goes away. Additionally, the error goes away ifInteger
is used as the type:ArrayList<Integer> a = new ArrayList();
. – AcetifyE
affects the type parameteT
in the parameterized method. – Venetian