Si vous regardez à la mise en œuvre de l' toArray(T[] a)
de ArrayList<E> de la classe, c'est comme:
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
Le problème avec cette méthode est que vous avez besoin pour passer un tableau du même type générique. Considérons maintenant si cette méthode ne prendre aucun argument alors la mise en œuvre serait quelque chose de similaire:
public <T> T[] toArray() {
T[] t = new T[size]; // compilation error
return Arrays.copyOf(elementData, size, t.getClass());
}
Mais le problème, c'est que vous ne pouvez pas créer générique tableaux en Java , car le compilateur ne sait pas exactement ce qu' T
représente. En d'autres termes la création de la matrice d'une non-reifiable type (JLS §4.7) n'est pas autorisé en Java.
Un autre élément important de devis à partir de la Matrice de Magasin Exception (JLS §10.5):
Si le type de composant d'un tableau n'ont pas été reifiable (§4.7), la Machine Virtuelle Java n'a pas pu effectuer le store check décrit dans la
paragraphe précédent. C'est pourquoi la création de la matrice d'expression avec un
non reifiable type d'élément est interdit (§15.10.1).
C'est pourquoi Java a fourni une version surchargée toArray(T[] a)
.
Je vais remplacer la méthode toArray() pour lui dire qu'il sera de retour une
tableau d'E.
Ainsi, au lieu d'annuler toArray()
, vous devez utiliser toArray(T[] a)
.
Ne peut pas Créer des Instances de Paramètres de Type de Java Doc peut également être intéressant pour vous.