Cet article analyse la méthode de modification de la liste et du tableau en Java. Partagez-le pour tout le monde pour votre référence. Les détails sont les suivants:
Aujourd'hui, j'ai écrit le code pour rencontrer un problème étrange. comme suit:
ArrayList <string> list = new ArrayList <string> (); String Strings [] = (String []) List.toArray ();
Je pense qu'il ne devrait pas y avoir de problème dans l'écriture de code de cette manière, et il n'y a pas de compilation de problèmes. Cependant, lorsque l'opération spécifique est en cours d'exécution, le rapport est anormal, comme suit: Exception dans Thread "Main" java.lang.classCastException: [ljava.lang.object;
Mais il n'y a aucun problème à écrire comme ceci:
ArrayList <string> list = new ArrayList <string> (); String Strings [] = New String [list.size (); list.get (i);}
Nous pouvons expliquer ce phénomène: Java permet une transformation vers le haut et vers le bas, mais si cette transformation est réussie en fonction du type de cet objet dans la machine virtuelle Java. La machine virtuelle Java enregistre le type de chaque objet. Le tableau est également un objet. Le type de tableau [ljava.lang.object. La conversion [ljava.lang.object en [ljava.lang.string est évidemment impossible, car il s'agit d'une transformation vers le bas, et la machine virtuelle préserve seulement qu'il s'agit d'un tableau d'objet. Dans le tableau est l'élément est l'élément du tableau. Les éléments du tableau ne sont que les références de l'élément, et non l'élément spécifique du stockage, donc le type d'élément dans le tableau est toujours stocké dans la machine virtuelle Java.
Selon l'explication ci-dessus, nous pouvons résumer ce problème au modèle suivant:
Objet objs [] = nouvel objet [10];
C'est la même chose que la compilation ci-dessus. Si nous modifions ce code, comme suit:
String strs [] = nouvelle chaîne [10]; objet Objs [] = STRS;
Cela peut être compilé et passé. Nous pouvons donc attribuer ce problème à un problème d'une règle de transformation Java. Parlons du soutien du tableau Java sur le modèle.
JDK5 prend déjà en charge les types de modèles, ce qui peut garantir la sécurité des types de données dans la collecte et la carte. Personnellement, je dois retourner le T [] correspondant selon le modèle. Examinez de plus près le code source de JDK et trouvez que la liste a deux façons de se transformer en tableau:
objet public [] toArray ();
Cette méthode renvoie tous les éléments de la liste dans un tableau de la même taille, et tous les éléments du tableau sont le type d'objet.
public <T> t [] toArray (t [] a);
Cette méthode renvoie tous les éléments de la liste dans un tableau de la même taille, et tous les éléments du tableau sont de type T.
La liste est conçue parce que le compilateur Java ne nous permet pas d'avoir de nouveaux réseaux de modèles. C'est-à-dire que vous ne pouvez pas définir un tableau comme ceci:
T arr = new t [size];
Mais vous pouvez utiliser t [] pour représenter le tableau, et vous pouvez convertir le tableau en t []. Par exemple, le public <T> t [] toArray (t [] a) dans la liste est réalisé:
public <T> t [] toArray (t [] a) {if (a.length <size) a = (t []) java.lang.reflect.array.newinstance (a.getClass (). getComponentType (), GetComponentType (), taille);
Il peut être vu à partir du code ci-dessus que, parce que vous ne connaissez pas le type de ce tableau, vous devez créer ce tableau via le mécanisme de réflexion (A.getClass (). GetComponentType () pour obtenir un type d'élément de tableau).
En fin de compte, la liste se convertit en tableau pour le gérer ::
ArrayList <string> list = new ArrayList <string> (); String [] Strings = New String [list.size ();
Inversement, que se passe-t-il si vous souhaitez transformer le tableau en liste? comme suit:
String [] S = {"A", "B", "C"};
On espère que cet article est utile à la conception du programme Java de tous.