Downcasting [Résolu]

Urgent_Java - 29 nov. 2017 à 14:02 - Dernière réponse : KX 15074 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention
- 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
Afficher la suite 

3 réponses

Répondre au sujet
Dalfab 294 Messages postés dimanche 7 février 2016Date d'inscription 7 décembre 2017 Dernière intervention - 29 nov. 2017 à 15:26
0
Utile
2
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;//
KX 15074 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention - 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);
}
Commenter la réponse de Dalfab