Pseudo-Archive Java :
Accueil -|- Visuel -|- Logistique -|- Applications réparties
La pseudo-archive Java est un service proposé par la SARL diaam informatique, et il est hébergé par la Sogid.
diaam informatique
From:           	Frédéric Laurent <f.laurent@alplog.fr>
To:             	"Java@U-Strasbg.Fr" <java@u-strasbg.fr>
Subject:        	cast a 2 francs...
Date sent:      	Tue, 19 Jun 2001 14:18:00 +0200
Send reply to:  	java@u-strasbg.fr

Salut,

Je pensais que le cast suivant était correct, mais à priori pas du tout
(Exception ClassCastException)

Vector vect = ....
String[] t = (String [])(vect.toArray());

Plus généralement, on ne peut pas faire un cast "Object []" en
"Toto []" ?

(je n'ai pas parcouru la spec en détail...)
A+

--
Frédéric Laurent
http://flrt.free.fr

     

Send reply to:  	<godreul1@bst.bsf.alcatel.fr>
From:           	"Rodolphe Godreul" <rodolphe@godreul.com>
To:             	<java@u-strasbg.fr>
Subject:        	RE: cast a 2 francs...
Date sent:      	Tue, 19 Jun 2001 14:21:30 +0200

> Je pensais que le cast suivant était correct, mais à priori pas du tout
> (Exception ClassCastException)
>
> Vector vect = ....
> String[] t = (String [])(vect.toArray());
>
> Plus généralement, on ne peut pas faire un cast "Object []" en
> "Toto []" ?
>
> (je n'ai pas parcouru la spec en détail...)
> A+


ben non parceque vect.toArray() renvoie un Object[] !
d ailleurs on peut imaginer que tu ais mis n importe quoi
dans ton vector et pas seulement des String

     

From:           	Olivier Dedieu <Olivier.Dedieu@inria.fr>
Date sent:      	Tue, 19 Jun 2001 14:27:15 +0200 (CEST)
To:             	<godreul1@bst.bsf.alcatel.fr>
Copies to:      	<java@u-strasbg.fr>
Subject:        	RE: cast a 2 francs...
Send reply to:  	Olivier.Dedieu@inria.fr


>  > Je pensais que le cast suivant était correct, mais à priori pas du
>  > tout (Exception ClassCastException)
>  >
>  > Vector vect = ....
>  > String[] t = (String [])(vect.toArray());
>  >
>  > Plus généralement, on ne peut pas faire un cast "Object []" en
>  > "Toto []" ?
>  >
>  > (je n'ai pas parcouru la spec en détail...)
>  > A+
>  
>  
>  ben non parceque vect.toArray() renvoie un Object[] !
>  d ailleurs on peut imaginer que tu ais mis n importe quoi
>  dans ton vector et pas seulement des String

Et c'est bien pour ca que la classe Vector (et toutes les classes
dérivant de java.util.Collection) fournit une methode speciale (cf
javadoc) :

String[] x = (String[]) v.toArray(new String[0]);

a+

---------------------------------------------------------------
 Olivier Dedieu - (INRIA - Bull / WebTools - Pharos)
 Web: http://www-sor.inria.fr/~dedieu  
 JavaChannel: http://www.java-channel.org/
 Pharos team: http://webtools.dyade.fr/pharos/
---------------------------------------------------------------
     

From:           	Erik Mazoyer <erik.mazoyer@hyperoffice.fr>
To:             	"'java@u-strasbg.fr'" <java@u-strasbg.fr>
Subject:        	RE: cast a 2 francs...
Date sent:      	Tue, 19 Jun 2001 14:35:56 +0200
Send reply to:  	java@u-strasbg.fr

La solution est d'écrire

String[]	t	= new String[vect.size()];
vect.toArray(t);

Cordialement,

--------------------------------------------------------------------
Erik Mazoyer, Chef de projet
HyperOffice
6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex
Tél. 01 41 96 96 76
Fax 01 41 96 96 77
Mél  erik.mazoyer@hyperoffice.fr 

-----Message d'origine-----
De: Frédéric Laurent [mailto:f.laurent@alplog.fr]
Date: mardi 19 juin 2001 14:18
À: Java@U-Strasbg.Fr
Objet: cast a 2 francs...


Salut,

Je pensais que le cast suivant était correct, mais à priori pas du tout
(Exception ClassCastException)

Vector vect = ....
String[] t = (String [])(vect.toArray());

Plus généralement, on ne peut pas faire un cast "Object []" en
"Toto []" ?

(je n'ai pas parcouru la spec en détail...)
A+

--
Frédéric Laurent
http://flrt.free.fr

     

From:           	Frédéric Laurent <f.laurent@alplog.fr>
To:             	"Java@U-Strasbg.Fr" <java@u-strasbg.fr>
Subject:        	RE: cast a 2 francs...
Date sent:      	Tue, 19 Jun 2001 14:39:00 +0200
Send reply to:  	java@u-strasbg.fr

> Et c'est bien pour ca que la classe Vector (et toutes les classes
> dérivant de java.util.Collection) fournit une methode speciale
> (cf javadoc) :
>
> String[] x = (String[]) v.toArray(new String[0]);
>
> a+

Bien vu... mais je dois avouer qu'à la lecture de la description
simplifiée, j'ai du mal à penser à ça !

Object[] toArray(Object[] a)
Returns an array containing all of the elements in this Vector in the
correct order

Par contre, en lisant la description détaillée de la méthode, je
m'incline. Entre nous, je trouve ça moyen de passer par un new pour lui
indiquer un type, mais bon...

merci Olivier

a+

--
Frédéric Laurent
http://flrt.free.fr
     

From:           	Frédéric Laurent <f.laurent@alplog.fr>
To:             	<java@u-strasbg.fr>
Subject:        	RE: cast a 2 francs...
Date sent:      	Tue, 19 Jun 2001 14:48:46 +0200
Send reply to:  	java@u-strasbg.fr

ok, merci

> -----Message d'origine-----
> De : Erik Mazoyer [mailto:erik.mazoyer@hyperoffice.fr]
> Envoyé : mardi 19 juin 2001 14:36
> À : 'java@u-strasbg.fr'
> Objet : RE: cast a 2 francs...
>
>
> La solution est d'écrire
>
> String[]	t	= new String[vect.size()];
> vect.toArray(t);
>
> Cordialement,
>
> --------------------------------------------------------------------
> Erik Mazoyer, Chef de projet HyperOffice 6, rue Jacques Daguerre - 92565
> Rueil-Malmaison Cedex Tél. 01 41 96 96 76 Fax 01 41 96 96 77 Mél 
> erik.mazoyer@hyperoffice.fr
>
> -----Message d'origine-----
> De: Frédéric Laurent [mailto:f.laurent@alplog.fr]
> Date: mardi 19 juin 2001 14:18
> À: Java@U-Strasbg.Fr
> Objet: cast a 2 francs...
>
>
> Salut,
>
> Je pensais que le cast suivant était correct, mais à priori pas du tout
> (Exception ClassCastException)
>
> Vector vect = ....
> String[] t = (String [])(vect.toArray());
>
> Plus généralement, on ne peut pas faire un cast "Object []" en
> "Toto []" ?
>
> (je n'ai pas parcouru la spec en détail...)
> A+
>
> --
> Frédéric Laurent
> http://flrt.free.fr

     

From:           	"Nicolas DELSAUX" <nicolas.delsaux@free.fr>
To:             	<java@u-strasbg.fr>
Subject:        	RE : cast à deux francs
Date sent:      	Wed, 20 Jun 2001 10:57:52 +0200
Send reply to:  	java@u-strasbg.fr


Bonjour,
----- Original Message -----
From: Frédéric Laurent <f.laurent@alplog.fr>
To: Java@U-Strasbg.Fr <java@u-strasbg.fr>
Sent: Tuesday, June 19, 2001 2:39 PM
Subject: RE: cast a 2 francs...


>
> Par contre, en lisant la description détaillée de la méthode, je
m'incline.
> Entre nous, je trouve ça moyen de passer par un new pour lui indiquer un
> type, mais bon...

C'est peut-être moyen, mais ça reste la meilleure méthode. J'ai déja
essayé bien des fois de passer des classes en paramètres, et on bute
malheureusement sur les problèmes typiques de Java : que faire lorsque
l'objet est un type primitif, ou pire, un tableau. Dans ces cas-là, Class,
qui marche très bien pour une classe normale, souffre de problèmes assez
importants pour bien passer les données. D'autre part, je ne sais pas si
tu as déja écrit un code avec un appel à une méthode dont un paramètre
soit un objet Class, mais je peux te dire que c'est duraille : si tu as
maMethode(Class maClass) et que tu écris maMethode(java.lang.String) , ça
ne marche pas car le compilateur pense que tu lui passes un objet membre
public d'une hypothétique classe java. De la même manière
maMethode(String) ne marche pas, car String correspond à une déclaration
de classe, et non aps à l'objet Class associé à la classe String (enfin,
c'est ce que je pense d'après les messages d'erreur du compilateur). Il
faut donc écrire maMethode(Class.forName("java.lang.String")) ce qui est
lourd, car tu dois alors gérer les exceptions dûes à l'appel de forName,
et là, tu arrêtes et tu passes un objet sur lequel tu fais un getClass,
qui marche mieux ! Comme quoi l'introspection, c'est pas toujours très
beau ! > > merci Olivier > > a+ > > -- > Frédéric Laurent >
http://flrt.free.fr > > Nicolas Delsaux

     

Send reply to:  	<godreul1@bst.bsf.alcatel.fr>
From:           	"Rodolphe Godreul" <rodolphe@godreul.com>
To:             	<java@u-strasbg.fr>
Subject:        	RE: RE : cast à deux francs
Date sent:      	Wed, 20 Jun 2001 11:13:03 +0200



> Il faut donc écrire maMethode(Class.forName("java.lang.String"))
> ce qui est
> lourd, car tu dois alors gérer les exceptions dûes à l'appel de
> forName, et

tu peux faire :
String.class

     

Date sent:      	Wed, 20 Jun 2001 11:20:10 +0200
From:           	Guillaume Desnoix <guillaume@desnoix.com>
To:             	java@u-strasbg.fr
Subject:        	Re: RE : cast à deux francs
Send reply to:  	java@u-strasbg.fr

Nicolas DELSAUX:

> Il faut donc écrire maMethode(Class.forName("java.lang.String"))

Il suffit d'ecrire maMethode(String.class);
J'utilise souvent cette construction, notament pour les ressources.
Guillaume

     

From:           	Olivier Dedieu <Olivier.Dedieu@inria.fr>
Date sent:      	Wed, 20 Jun 2001 11:39:48 +0200 (CEST)
To:             	java@u-strasbg.fr
Subject:        	Re: RE : cast à deux francs
Send reply to:  	Olivier.Dedieu@inria.fr


>  C'est peut-être moyen, mais ça reste la meilleure méthode. J'ai déja
>  essayé bien des fois de passer des classes en paramètres, et on bute
>  malheureusement sur les problèmes typiques de Java : que faire lorsque
>  l'objet est un type primitif, ou pire, un tableau. Dans ces cas-là,
>  Class, qui marche très bien pour une classe normale, souffre de
>  problèmes assez importants pour bien passer les données. 

De meme que tu peux faire String.class, tu peux aussi faire int.class,
boolean.class, String[].class ... Magic ;-)

>  D'autre part, je ne sais pas si tu
>  as déja écrit un code avec un appel à une méthode dont un paramètre
>  soit un objet Class, mais je peux te dire que c'est duraille : si tu as
>  maMethode(Class maClass) et que tu écris maMethode(java.lang.String) ,
>  ça ne marche pas car le compilateur pense que tu lui passes un objet
>  membre public d'une hypothétique classe java.

Il faut faire maMethod(String.class);


>  Comme quoi l'introspection, c'est pas toujours très beau !

Comme quoi il faut lire Java Language Specficiation ;-)))))
http://java.sun.com/docs/books/jls/

a+

---------------------------------------------------------------
 Olivier Dedieu - (INRIA - Bull / WebTools - Pharos)
 Web: http://www-sor.inria.fr/~dedieu  
 JavaChannel: http://www.java-channel.org/
 Pharos team: http://webtools.dyade.fr/pharos/
---------------------------------------------------------------

     

From:           	Olivier Dedieu <Olivier.Dedieu@inria.fr>
Date sent:      	Wed, 20 Jun 2001 11:44:16 +0200 (CEST)
To:             	java@u-strasbg.fr
Subject:        	RE: cast a 2 francs...
Send reply to:  	Olivier.Dedieu@inria.fr


>  Par contre, en lisant la description détaillée de la méthode, je
>  m'incline. Entre nous, je trouve ça moyen de passer par un new pour lui
>  indiquer un type,

Le new ne sert pas qu'à indiquer le type. Sinon, on aurait pu passer
String.class ou String[].class. Il sert aussi a préalloue un
tableau. Ca peut etre utile dans le cas ou tu réutilise le meme
tableau pour eviter les réallocation.

Mais le mieux qd on a un doute est d'aller voir les source de
java. Voila l'extrait de java.util.Vector:

    public synchronized Object[] toArray(Object a[]) {
        if (a.length < elementCount)
            a = (Object[])java.lang.reflect.Array.newInstance(
                                a.getClass().getComponentType(),
                                elementCount);

 System.arraycopy(elementData, 0, a, 0, elementCount);

        if (a.length > elementCount)
            a[elementCount] = null;

        return a;
    }



-- 
---------------------------------------------------------------
 Olivier Dedieu - (INRIA - Bull / WebTools - Pharos)
 Web: http://www-sor.inria.fr/~dedieu  
 JavaChannel: http://www.java-channel.org/
 Pharos team: http://webtools.dyade.fr/pharos/
---------------------------------------------------------------


     

From:           	"Nicolas DELSAUX" <nicolas.delsaux@free.fr>
To:             	<java@u-strasbg.fr>
Subject:        	Re: RE : cast à deux francs
Date sent:      	Wed, 20 Jun 2001 12:07:54 +0200
Send reply to:  	java@u-strasbg.fr


----- Original Message -----
From: Olivier Dedieu <Olivier.Dedieu@inria.fr>
To: <java@u-strasbg.fr>
Sent: Wednesday, June 20, 2001 11:39 AM
Subject: Re: RE : cast à deux francs


>
> De meme que tu peux faire String.class, tu peux aussi faire int.class,
> boolean.class, String[].class ... Magic ;-)

Dingue...
Complètement dingue !
Comme quoi, on en apprend tous les jours; Mais ce .class, comment est-il
traité par la JVM ? il sert à indiquer qu'on manipule l'objet Class
directement, c'est ça ? Trop abracadabrantesque ! > > > Il faut faire
maMethod(String.class); > > > >  Comme quoi l'introspection, c'est pas
toujours très beau ! > > Comme quoi il faut lire Java Language
Specficiation ;-))))) > http://java.sun.com/docs/books/jls/

Mouiiii, c'est le genre d'argument ultra-massue qui fait super mal au
crâne. Mais au fait c'est quoi ce .class ? C'est un champ mystère, ou un
chaispaskoi psychédélique ? En fait, voilà encore un exemple de la
puissance de cette mailing-list : on pense répondre correctement à une
question, et on se retrouve à en poser une dizaine. Franchement, vous
n'êtes pas drôles ;) Blague à part, c'est encore une bonne raison
d'adhérer : découvrir les nouveaux mots de pouvoir de Java (parce que là,
sortir ce .class dans une conversation, ça doit vraiment tuer la
contradiction dans l'oeuf). > > a+ > >
--------------------------------------------------------------- >  Olivier
Dedieu - (INRIA - Bull / WebTools - Pharos) >  Web:
http://www-sor.inria.fr/~dedieu >  JavaChannel:
http://www.java-channel.org/ >  Pharos team:
http://webtools.dyade.fr/pharos/ >
--------------------------------------------------------------- > >
Nicolas Delsaux




     

Date sent:      	Wed, 20 Jun 2001 12:23:32 +0200
From:           	Guillaume Desnoix <guillaume@desnoix.com>
To:             	java@u-strasbg.fr
Copies to:      	Olivier.Dedieu@inria.fr
Subject:        	Re: cast a 2 francs...
Send reply to:  	java@u-strasbg.fr

Olivier Dedieu:

> Le new ne sert pas qu'à indiquer le type. Sinon, on aurait pu passer
> String.class ou String[].class. Il sert aussi a préalloue un tableau. Ca
> peut etre utile dans le cas ou tu réutilise le meme tableau pour eviter
> les réallocation.
>     public synchronized Object[] toArray(Object a[]) {
>         if (a.length < elementCount)
>             a = (Object[])java.lang.reflect.Array.newInstance(
>                                 a.getClass().getComponentType(),
>                                 elementCount);
> 
> 	System.arraycopy(elementData, 0, a, 0, elementCount);
> 
>         if (a.length > elementCount)
>             a[elementCount] = null;
> 
>         return a;
>     }

C'est d'ailleurs pour cette raison que je n'"aime" pas du tout cette
methode. En sortie, on ne sait pas si on aura le tableau passe en
parametre ou un nouveau, ni quelle sera sa taille. Il aurait mieux valu
deux methodes claires: Object[] toArray(Class); void    
toArray(Object[]);

Guillaume

     

From:           	Olivier Dedieu <Olivier.Dedieu@inria.fr>
Date sent:      	Wed, 20 Jun 2001 13:13:55 +0200 (CEST)
To:             	Guillaume Desnoix <guillaume@desnoix.com>
Copies to:      	java@u-strasbg.fr
Subject:        	Re: cast a 2 francs...
Send reply to:  	Olivier.Dedieu@inria.fr


>  C'est d'ailleurs pour cette raison que je n'"aime" pas du tout cette
>  methode. En sortie, on ne sait pas si on aura le tableau passe en
>  parametre ou un nouveau, ni quelle sera sa taille. Il aurait mieux valu
>  deux methodes claires: Object[] toArray(Class); void    
>  toArray(Object[]);

Oui je suis absolument d'accord avec toi. 

a+

---------------------------------------------------------------
 Olivier Dedieu - (INRIA - Bull / WebTools - Pharos)
 Web: http://www-sor.inria.fr/~dedieu  
 JavaChannel: http://www.java-channel.org/
 Pharos team: http://webtools.dyade.fr/pharos/
---------------------------------------------------------------


C'est fini ! Retour à l'accueil de la pseudo-archive