ArrayList vers String[] et transtypage de tableau en Java

J’ai appris une petite subtilité de Java aujourd’hui, sur le transtypage de tableaux. Un tableau de type Object[] ne peut pas être caster en String[] même si chacun de ces Objects sont en fait des Strings. J’ai rencontré le problème avec une ArrayList que je voulais « transformer » en String[]. Il ne suffit pas de bêtement utilisé toArray() et de caster le tableau retourné. Le code suivant illustre le problème de trantypage (donnant lieu à une ClassCastException) et donne aussi la méthode correcte pour transformer l’ArrayList en tableau.

package tests;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<>();

		list.add("hello, ");
		list.add("world");

		try {
			String[] array = (String[]) list.toArray();
			printStringArray(array);
		} catch (ClassCastException e) {
			e.printStackTrace();
		}

		String[] array = list.toArray(new String[list.size()]);
		printStringArray(array);
	}

	static void printStringArray(String[] array) {
		for(String s : array) {
			System.out.println(s);
		}
	}

}

Le résultat de l’exécution est :

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
	at tests.Main.main(Main.java:15)
hello, 
world

Si vous avez un tableau d’Objects et que vous souhaitez le transformer en tableau de Strings (on passe ici dans un contexte plus général que mon histoire d’ArrayList), il faut utiliser System.arrayCopy() ou encore Arrays.copyOf(). Voir cette discussion sur stacksoverflow: How to convert object array to string array in Java.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s