web-dev-qa-db-fra.com

conversion d'un tableau d'objets en une erreur de tableau entier

Quel est le problème avec le code suivant?

Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;

Le code a l'erreur suivante à la dernière ligne:

Exception dans le fil "principal" Java.lang.ClassCastException: [Ljava.lang.Object; ne peut pas être converti en [Ljava.lang.Integer;

62
Ross

Ross, vous pouvez aussi utiliser Arrays.copyof () ou Arrays.copyOfRange ().

Integer[] integerArray = Arrays.copyOf(a, a.length, Integer[].class);
Integer[] integerArray = Arrays.copyOfRange(a, 0, a.length, Integer[].class);

Ici, la raison de frapper ClassCastException est que vous ne pouvez pas traiter un tableau de Integer comme un tableau de Object. Integer[] est un sous-type de Object[] mais Object[] n'est pas un Integer[].

Et ce qui suit ne donnera pas non plus un ClassCastException.

Object[] a = new Integer[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
88
namalfernandolk

Vous ne pouvez pas convertir un tableau Object en un tableau Integer. Vous devez faire une boucle à travers tous les éléments d'un et lancer chacun individuellement.

Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = new Integer[a.length];
for(int i = 0; i < a.length; i++)
{
    c[i] = (Integer) a[i];
}

Edit: Je crois que cette restriction s’explique par le fait que, lors de la conversion, la machine virtuelle veut assurer la sécurité des types au moment de l’exécution. Puisqu'un tableau de Objects peut être autre chose que Integers, la machine virtuelle Java devrait faire ce que le code ci-dessus fait de toute façon (regardez chaque élément individuellement). Les concepteurs de langage ont décidé qu'ils ne souhaitaient pas que la machine virtuelle Java le fasse (je ne sais pas pourquoi, mais je suis sûr que c'est une bonne raison).

Cependant, vous pouvez convertir un tableau de sous-types en un type de supertype (par exemple, Integer[] à Object[])!

21
Sean

Ou faites ce qui suit:

...

  Integer[] integerArray = new Integer[integerList.size()];
  integerList.toArray(integerArray);

  return integerArray;

}
14
Michael
Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

vous essayez de lancer un tableau d'objets à lancer dans un tableau d'entiers. Vous ne pouvez pas le faire. Ce type d'abaissement n'est pas autorisé.

Vous pouvez créer un tableau d'Integer, puis copier toutes les valeurs du premier tableau dans le second tableau.

4
Tommaso Taruffi