I was just looking at the method defined in the List interface:
, and I have a question. Why is it generic? Because of that fact, m
The reason this method is as it is is mostly historic.
There is a difference between generic classes and array types: whereas the type parameters of generic class are erased at run-time, the type of the elements of arrays is not. So, at run-time, the JVM sees no difference between List<Integer> and List<String>, but it does see a difference between Integer[] and String[]! The reason for this difference is that arrays have always been there, from Java 1.0 onwards, whereas generics where only added (in a backward-compatible way) in Java 1.5.
The Collections API was added in Java 1.2, before the introduction of generics. At that time the List interface already contained a method
Object[] toArray(Object[] a);
(see this copy of the 1.2 JavaDoc). This was the only way to create an array with a user-specified runtime type: the parameter a served as a type token, that is, it determined the runtime type of the returned array (note that if A is a subclass of B, A[] is considered a subtype of B[] although List<A> is not a subtype of List<B>).
When generics were introduced in Java 1.5, many existing methods were made generic, and the toArray method became
<T> T[] toArray(T[] a);
which, after type erasure, has the same signature as the original non-generic method.