Downcasting

Résolu
Urgent_Java -  
KX Messages postés 19031 Statut Modérateur -
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

  1. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    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
    1. Urgent_Java
       
      Merci bcp
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      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