IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Caster une liste


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Par défaut Caster une liste
    Bonjour,

    J'ai une Classe B qui hérite de A
    Dans une autre classe, j'aimerai utiliser la méthode ci-dessous mais je ne peux renvoyer une list<B>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	private List<A> wrapListOfA(ResultSet rs) {
    		List<B>listOfB = new ArrayList();
    		return (List<B>)Wrapper.wrapListOfB(rs,listOfB);
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Type mismatch: cannot convert from List<B> to List<A>
    Pourtant la méthode ci-dessous fonctionne bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	private A wrapA(ResultSet rs) {
    		return (B)Wrapper.wrapB(rs,new B());
    	}
    Avez-vous une méthode pour caster une List<B> vers List<A>. A étant une super-classe de B.

    Merci pour votre aide

  2. #2
    Membre chevronné
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Par défaut
    Bonjour,

    Ce n'est pas parce que A est une superclasse de B que List<A> est une super classe de List<B>.
    Voici ce que vous pouvez faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private List<B> wrapListOfA(ResultSet rs) {
    		List<B> listOfB = new ArrayList();
    		return (List<B>)Wrapper.wrapListOfB(rs,listOfB);
    	}
     ....
    //Appel de wrapListOfA
    List<A> liste =  wrapListOfA(rs);
    B elem0 = (B)(liste.get(0));
    ...
    Ou sinon vous pouvez retourner simplement une List, mais je crois que c'est obsolète ...

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    faudra que tu change ta méthode wrap et lui passer le Class en paramètre ou en générique càd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <T> T wrap(ResultSet rs) {
     //...
    }
    Faudra récupérer le T.class a partir du parametre générique T sinon il fault le passé autant que paramètre dans la méthode wrap càd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <T> T wrap(ResultSet rs, Class<T> cl) {
     //...
    }
    A++

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par pingoui Voir le message
    Avez-vous une méthode pour caster une List<B> vers List<A>. A étant une super-classe de B.

    Merci pour votre aide
    Ce n'est pas possible !
    Par contre tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	private List<A> wrapListOfA(ResultSet rs) {
    		List<B>listOfB = new ArrayList();
    		listOfB = Wrapper.wrapListOfB(rs,listOfB);
    		return new ArrayList<A>(listOfB)
    	}

  5. #5
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Par défaut
    Merci pour votre aide.
    J'ai adopté la méthode ci-dessous

    Citation Envoyé par Rei Ichido Voir le message
    Ce n'est pas possible !
    Par contre tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	private List<A> wrapListOfA(ResultSet rs) {
    		List<B>listOfB = new ArrayList();
    		listOfB = Wrapper.wrapListOfB(rs,listOfB);
    		return new ArrayList<A>(listOfB)
    	}

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    J'aimerais faire une remarque sur le pourquoi du comment ce n'est pas possible.

    Si B est une classe fille de A, alors on peut dire qu'un B est un A particulier. Partout où on traite des A, on peut fournir un B à la place, ce n'est pas gênant, car un B est aussi un A.

    A contrario, un List<B> n'est pas du tout un List<A>.
    Exemple simple : quand on a un List<A>, on peut y insérer des A. Mais quand on a un List<B>... Un List<B> contient des B, pas des A ! Pas question d'y mettre des A ! Par conséquent, un List<B> ne peut pas faire tout ce qu'un List<A> peut faire. On ne peut donc pas substituer l'un à l'autre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Par défaut
    Merci pour les précisions

    Pour ma culture, peut-on faire l'inverse ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	private List<B> getAllB() {	
    		List<A> listOfA = processReq(sqlReq,true);
    		return new ArrayList<B>(listOfA);
    	}
    A mon avis, non!
    Et je ferais comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	private List<B> getAllB() {	
    		List<A> listOfA = processReq(sqlReq,true);
    		List<Station> listOfStation = new ArrayList<Station>() ;
    		for (A aaaa : listOfA){
    			listOfB.add((B) aaaa);
    		}
    		return listOfB;
    	}
    Est-ce propre

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Dans le sens contraire, un List<A> n'est pas un List<B>. Quand on récupère les éléments d'un List<B>, on obtient des B. Or, quand on récupère les éléments d'un List<A>, on obtient des A, et les A ne sont pas des B.
    On ne peut pas non plus les substituer dans ce sens.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private List<B> getAllB() {	
    		List<A> listOfA = processReq(sqlReq,true);
    		List<Station> listOfStation = new ArrayList<Station>() ;
    		for (A aaaa : listOfA){
    			listOfB.add((B) aaaa);
    		}
    		return listOfB;
    	}
    Est-ce propre
    Non seulement ce n'est pas propre, mais ça a bien peu de chances de marcher. On ne peut pas caster un A en B comme ça, sans savoir si c'est vraiment un B.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. "Caster" le contenu d'une liste
    Par Santalyn dans le forum C#
    Réponses: 2
    Dernier message: 25/04/2010, 20h46
  2. Caster le résultat d'une liste en double
    Par Incinerator dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 24/11/2008, 12h28
  3. caster une List<Object> en List<..>
    Par K-Kaï dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2006, 17h43
  4. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 15h30
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo