66 votes

conversion du tableau d'objets en 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 sur la dernière ligne: Exception dans le thread "principal" java.lang.ClassCastException: [Ljava.lang.Object; ne peut pas être converti en [Ljava.lang.Integer;

90voto

Namalak Points 2121

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 un ClassCastException est que vous ne pouvez pas traiter une liste d'objets IS-A entiers, bien qu'un objet entier IS-A (n).

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;
 

21voto

Sean Points 3298

Vous ne pouvez pas jeter un tableau d'Objets vers un tableau d'Entiers. Vous disposez d'une boucle sur tous les éléments de l'un et de fonte de chacun d'eux 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 la justification de cette restriction est que lors de la coulée, la JVM veut assurer la sécurité du type à l'exécution. Depuis un tableau d'Objets peut être autre chose que des Entiers, la JVM aurait à faire ce que le code ci-dessus est faites de toute façon (voir chaque élément individuellement). La langue de créateurs ont décidé qu'ils ne voulaient pas la JVM pour le faire (je ne sais pas pourquoi, mais je suis sûr que c'est une bonne raison).

Cependant, vous pouvez jeter un sous-type tableau à une supertype array (par exemple, Integer[] de l'Objet[])!

14voto

Michael Points 622

Ou faites ce qui suit:

 ...

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

  return integerArray;

}
 

4voto

Tommaso Taruffi Points 2264
 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X