Bizarre génériques comportement de la Liste.toArray(T[])

Je suis tombé sur quelque chose de très basique, mais très déconcertant aujourd'hui. J'avais besoin de convertir une liste à un tableau. La liste contenue String instances. Parfait exemple de l'utilisation de List.toArray(T[]), car je voulais un String[] instance. Cela ne fonctionnerait pas, cependant, sans explicitement le casting du résultat de String[].

Comme un scénario de test, j'ai utilisé le code suivant:

import java.util.Arrays;
import java.util.List;

public class MainClass {
    public static void main(String args[]) {
        List l = Arrays.asList("a", "b", "c");
        String stuff[] = l.toArray(new String[0]);
        System.err.println(Arrays.asList(stuff));
    }
}

qui ne compile pas. C'est presque une copie exacte de l'exemple de la javadoc, mais le compilateur dit ce qui suit:

MainClass.java:7: incompatible types
found   : java.lang.Object[]
required: java.lang.String[]
    String stuff[] = l.toArray(new String[0]);
                          ^

Si j'ajoute un casting pour String[] de compiler ET de l'exécuter parfaitement. Mais ce n'est pas ce que j'attends, quand j'ai vu la signature de la méthode toArray:

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

Cela me dit que je ne devrais pas avoir à jeter. Ce qui se passe?

Edit:

Curieusement, si je change la déclaration de la liste à:

List<?> l = Arrays.asList("a", "b", "c");

il fonctionne également. Ou List<Object>. Donc il n'a pas à être un List<String> comme l'avait suggéré. Je commence à penser que l'utilisation du raw List type modifie la perception de méthodes génériques à l'intérieur que le travail en classe.

Deuxième edit:

Je pense que je l'obtenir maintenant. Ce que Tom Hawtin a écrit dans un commentaire ci-dessous semble être la meilleure explication. Si vous utilisez un type générique dans le raw façon, tous les génériques de l'information à partir de cette instance seront effacées par le compilateur.

InformationsquelleAutor waxwing | 2009-07-02