#1 Le 16/11/2007, à 04:55
- doc212
syntaxe de casting, transtypage, cast en java
Salut,
j'aurais une petite question concernant une syntaxe de casting.
D'abord, je crée un vecteur en utilisant la classe Vector dans le package java.util.
par ailleurs, j'ai une classe MaClasse avec une méthode publique retournant un String, disons MaMethode().
le code ci dessous ne compile pas
Vector V=new Vector();
MaClasse P=new MaClasse();
V.add(P);
System.out.println(V.elementAt(0).MaMethode());
car la fonction V.elementAt(0) retourne un objet de la classe Object qui ne possède pas la méthode MaMethode(). Il faudrait le caster vers un objet de la classe MaClasse mais je ne vois pas la syntaxe à utiliser.
j'ai essayé sans succès:
System.out.println((MaClasse)V.elementAt(0).MaMethode());
System.out.println(V.(MaClasse)elementAt(0).MaMethode());
System.out.println(V.elementAt(0).(MaClasse)MaMethode());
Bien sûr ce qui marche c'est de passer par un objet intermédiaire:
MaClasse tmp = new MaClasse()
tmp=(MaClasse)V.elementAt(0);
System.out.println(tmp.MaMethode());
Mais je me demandais juste si il n'y avait pas moyen de s'en passer ...
N.B. l'idée c'est que normalement ya pleins d'éléments dans le Vector et qu'on le parcours pour lancer les méthodes de ses éléments ... je me rends bien compte qu'avec un seul élément dans le Vector c'est très stupide comme idée ... :-)
Merci d'avance.
Hors ligne
#2 Le 16/11/2007, à 08:52
- Martopioche
Re : syntaxe de casting, transtypage, cast en java
Evidemment, tu a zappé la seule syntaxe qui marche...
(maClasse)(V.elementAt(0)).maMethode()
Et comme je suis pas certain à 100% que c'est exactement ça, il reste
((maClasse)(V.elementAt(0))).maMethode()
Par contre, si tu est sur du Java post 1.5, laisse tomber les Vectors, ça sert plus à rien.L'API des collections et les génériques te facilitent grandement la vie :
Collection<MaClasse> c = new ArrayList();
c.add(P);
// Puis pour parcourir - pareil pour un élément, c'est débile -
c.iterator.next().maMethode();
ou via un iterator pour les collections possédant plus d'un éléments. En plus elles sont bien plus performantes.
while (c.hasNext
Hors ligne
#3 Le 16/11/2007, à 10:15
- doc212
Re : syntaxe de casting, transtypage, cast en java
Merci pour le cast, la bonne forme était
((MaClasse)(V.elementAt(0))).MaMethode();
ce qui semblait logique en fait ... mais j'viens de me lancer dans java :-)
Apparemment le Collection<MaClasse> n'a pas l'air de passer ...
quand je fais java -version, j'obtiens
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)
Mais le truc des iterator m'a l'air bien pratique ...
while(V.iterator().hasNext())
System.out.println(V.listIterator().nextIndex()+"\n"+((Personne)(V.listIterator().next())).DecrisToi()
Mais j'ai un peu de mal avec... avec ce bout de code, il boucle sur le premier élément de mon vecteur
pourtant quand je fais appel à listIterator().next() il devrait renvoyer l'objet et l'iterator devrait passer à l'index suivant non ?
Hors ligne
#4 Le 16/11/2007, à 10:28
- Martopioche
Re : syntaxe de casting, transtypage, cast en java
Oulala, non...
Tu doit parcourir une liste, en utilisant un itérateur :
Collection<MaClasse> c...
Iterator<MaClasse i = c.iterator();
while (i.hasNext() {
i.next().maMethodeDeMaClasse();
// ou
MaClasse c = i.next();
traitements...
}
heu tiens : http://www.jmdoudoux.fr/java/dej/chap009.htm#chap_9
et http://www.jmdoudoux.fr/java/dej/chap018.htm#chap_18
Bon courage
Hors ligne
#5 Le 16/11/2007, à 16:29
- nono75
Re : syntaxe de casting, transtypage, cast en java
Salut,
tu as aussi la FAQ qui donne pas mal de trucs pour manier les collections :
http://java.developpez.com/faq/java/?page=langage_donnees
Tu peux aussi pouvoir utiliser la boucle foreach :
Collection<MaClasse> iterable;
for (Classe elem : iterable) {
elem.maMethode();
}
Hors ligne