Downcasting

Résolu/Fermé
Urgent_Java - Modifié le 29 nov. 2017 à 18:12
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 29 nov. 2017 à 18:25
Bonjour,
J'ai un petit problème de downcasting je crois,j'ai une classe mère Document et plusieurs classes fille : Livre,Revue,Dictionnaire.Livre a son tour a deux classes filles: Manuel et Roman.La classe Livre est la seule à avoir un attribut auteur et du coup la méthode getAuteur(). Dans une classe part Bibliotheque qui a un seule attribut: un vecteur de documents,on veut définir une méthode public void afficherAuteurs() de telle façon à afficher tous les auteurs des Documents qui ont possède 1. J'ai donc fait
public void afficherAuteurs() {
  Iterator<Document> itr = vct.iterator();
  while(itr.hasNext()){
   if (itr.next() instanceof Livre) {
    Livre l=(Livre)itr.next();//c'est ici que j'ai fait le downcasting
    System.out.println(l.getAuteur());
   }

Mais j'obtient une erreur d'exécution au niveau de la ligne Livre l=(Livre)itr.next(); ce qui veut dire que la promesse du downcasting n'a pas été tenue.
Avez-vous une idée de l'erreur que j'ai fait?
Merci

1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
29 nov. 2017 à 15:26
Il ne faut pas appeler 2 fois itr.next(), car le second va accéder à l'instance suivante.
Document doc = itr.next();
if ( doc instanceof Livre ) { 
	Livre livre = (Livre)doc;//
0
Urgent_Java
29 nov. 2017 à 16:15
Merci bcp
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
29 nov. 2017 à 18:25
Bonjour,

L'utilité des Iterator est quasi nulle depuis Java 5, donc à part quelques cas particuliers, si tu utilises un Iterator c'est par erreur.

Remarque : même chose pour la classe Vector qui devrait être remplacé par ArrayList dans la plupart des cas depuis Java 2 (et dans les autres cas par l'utilisation de Collections.synchronizedList).

Java 5+
public void afficherAuteurs() {
    for (Document doc : vct) {
        if (doc instanceof Livre) {
            Livre l = (Livre) doc;
            System.out.println(l.getAuteur());
        }
    }
}

Java 8+
public void afficherAuteurs() {
    vct.stream()
       .filter(doc -> doc instanceof Livre)
       .map(doc -> ((Livre) doc).getAutheur())
       .forEach(System.out::println);
}
0