Bonjour,
je voudrais caster un Object[] et String[] mais ça me génére une "ClassCastException". Comment faire ?
Cordialement
trax
Version imprimable
Bonjour,
je voudrais caster un Object[] et String[] mais ça me génére une "ClassCastException". Comment faire ?
Cordialement
trax
Code:
1
2
3
4
5
6
7
8 Object [] tablo = ... // tu l'instancie ou récupère tes valeurs. String [] tabls = new String [tablo.length]; for(int i=0 ; i<tabls.length ; i++){ tabls[i] = (String) tablo[i]; //lance 1 ClassCastException si tablo[i] n'est pas de type String (ou fils de String) }
Code:
1
2
3
4 int i=0; for(Object o:tablo){ tabls[i++] = o.toString(); }
o.toString();
renvoie l'adresse mémoire de l'Object.
Au temps pour moi :aie: :
Code:String.valueOf(o);
[HS]
pas possible, la classe String est déclarée final ;).Citation:
Envoyé par NeptuS
[/HS]
au temps pour moi ... mais le code reste juste ;)
merci pour l'info
ok mais il y a pas une méthode plus simple (genre un cast a la volé) que de parcourir tout le tableau ?
Ca me semble un peu lourd comme méthode si le tableau devient un tant soit peu long.
Non, tu ne peut pas le faire autrement, d'ailleurs si ton tableau n'est pas énorme, ce n'est pas lourd du tout.Citation:
Envoyé par trax44
Un tableau de String est aussi un tableau d'Object, mais un tableau d'object n'est pas un tableau de String, c'est pour ca que tu ne peut pas le caster de manière toute simple.
Si tu travaillais avec des Collection, tu aurais la possibilité de le faire...
Comment?:PCitation:
Si tu travaillais avec des Collection, tu aurais la possibilité de le faire...
j'ai pas tous lu.
tu veux passer de Object[] a des String[]?
tu peut essayer comme ca.
ps: j'ai pas moi meme tester :-)Code:
1
2
3
4
5
6
7
8
9
10 Object[] objects = new String[100]; for(int i = 0; i<100; i++) { objects[i] = MessageFormat.format("this is the string number {0}.\n", i + 1) ; } String[] strings = new String[objects.length]; (Arrays.asList(objects)).toArray(strings); System.out.println(Arrays.toString(strings));
Citation:
Envoyé par seriousme
En admettant biensur que la collection list ne contienne que des chaines de caractères.Code:String[] strings = (String[])list.toArray(new String[list.size()]);
Quelle différence avec:Code:String[] strings = (String[])list.toArray(new String[list.size()]);
?Code:String[] strings = (String[])list.toArray();
avec un toArray() simple, il vas lui même instancier un tableau d'Object alors que dans ma solution, tu lui transmet le tableau de String initialisé au bon nombre d'éléments et c'est la méthode qui se charge elle même de transferer les objects !
C'est une optimisation pour lui éviter de chercher la taille et le type?
Ca sert juste à lui macher le travail?
non, la taille c'est ce qui lui pose le moins de problème, c'est juste qu'il faut lui donné le type !
Si tu ne lui donne aucun type, il converti en Object[] !
N'oublie pas que le transtypage n'est pas passé à la méthode toArray() donc, si tu regarde la ligne suivante, tu te rends compte qu'il est impossible à la méthode de connaitre le type que TU attends !
Code:list.toArray();
OK, on évite un double transtypage en lui indiquant le type final attendu.
C'est ça?
non...
Il est où le type là ?Code:Object o = list.toArray();
Je veux dire dans le cas présent:
1)la méthode "toArray" crée un tableau d'"Object".Code:String[] strings = (String[])list.toArray();
2)elle le remplie avec des "Object".
3)elle le renvoie.
1)la méthode "toArray" remplie le tableau spécifié avec des "String".Code:String[] strings = (String[])list.toArray(new String[list.size()]);
2)elle le renvoie.
Donc avantage : on a directement un tableau du bon type.
C'est tout?