Je suis tombé sur quelque chose de très basique mais extrêmement déconcertant aujourd'hui. J'avais besoin de convertir une liste en tableau. La liste contenait String
instances. Exemple parfait d'utiliser List.toArray(T[])
, puisque je voulais une instance String[]
. Cela ne fonctionnerait pas, cependant, sans explicitement le résultat à String[]
.Comportement des génériques impairs de List.toArray (T [])
En tant que 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. Il est presque une copie exacte de l'exemple dans le 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 à String[]
il compiler et exécuter parfaitement. Mais ce n'est pas ce que je pense quand je regardais la signature du toArray:
<T> T[] toArray(T[] a)
Cela me dit que je ne devrais pas avoir à lancer. Que se passe-t-il?
Edit:
Chose curieuse, si je change la déclaration de liste:
List<?> l = Arrays.asList("a", "b", "c");
cela fonctionne aussi. Ou List<Object>
. Donc, il ne doit pas être un List<String>
comme cela a été suggéré. Je commence à penser que l'utilisation du type brut List
modifie également le fonctionnement des méthodes génériques à l'intérieur de cette classe.
Deuxième édition:
Je pense que je reçois 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 de manière brute, toutes les informations génériques de cette instance seront effacées par le compilateur.
Cela me semble logique, mais pas techniquement. Il ne me semble pas que la méthode toArray se soucie de ce qui est lié à E (c'est-à-dire la classe d'éléments de la liste). – waxwing
la signature de toArray est "public T [] toArray (T [] a)", T est le type de composant du tableau passé en –
dfa
Je ne peux pas non plus le comprendre, pire est qu'il fonctionne également en utilisant une liste