J’ai le code suivant où je crée un tableau et tente d’y stocker des objects. Au moment de l’exécution, je reçois une ArrayStoreException
.
import java.lang.reflect.Array; public class GenericsArrayCreation { public static void Test(T[] A){ @SuppressWarnings("unchecked") T[] temp = (T[]) Array.newInstance(A.getClass(), A.length); for(int i = 0;i<temp.length;i++){ temp[i] = A[i]; System.out.println(temp[i].toString()); } } public static void main(String[] args){ String[] strs = {"a", "b", "c"}; GenericsArrayCreation.Test(strs); } }
Je comprends en quelque sorte que c’est à cause de la déclaration
T[] temp = (T[]) Array.newInstance(A.getClass(), A.length);
Pourquoi est-ce faux? A.getClass()
à l’exécution renvoie une Ssortingng
. temp
doit donc être un tableau de chaînes. Dans ce cas, pourquoi l’assignation temp[i] = A[i]
ne fonctionne pas?
Le type de A
est java.lang.Ssortingng[]
, plutôt que java.lang.Ssortingng
.
Vous voulez le type de composant du tableau plutôt que le type de tableau lui-même.
Utilisez cette ligne à la place:
T[] temp = (T[]) Array.newInstance(A.getClass().getComponentType(), A.length);
et le code fonctionne bien.
Essayez d’imprimer temp.getClass()
– c’est un tableau de tableaux, T[][]
. Vous voudrez Class.getComponentType
.
votre A.getClass()
renvoie un tableau Ssortingng
et non Ssortingng
, raison pour laquelle vous obtenez ArrayStoreException
.