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

Java Discussion :

Question sur la généricité et les Collections


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Par défaut Question sur la généricité et les Collections
    Bonjour,


    Je ne parviens pas a comprendre comment caster une java.util.List comprenant un type générique vers une liste comprenant un autre type générique mais dans la meme hierarchie de classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public class Test
    {
    	public static void main(String[] args)
    	{
    		List<B> lstB = new ArrayList<B>();
     
    		List<A> lstA;
     
    		//Erreurs :
    		lstA = lstB;
    		//Erreurs :
    		lstA = (List<A>)lstB;
    	}
     
    	private class A
    	{
    		public String getA()
    		{
    			return "A";
    		};
    	}
     
    	private class B extends A
    	{
    		public String getB()
    		{
    			return "B";
    		}
    	}
    }
    Est ce que cela peut avoir un rapport avec les déclarations du type List<?> ??

    Merci

  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,
    Il y a un post récent à ce sujet :
    http://www.developpez.net/forums/d93.../caster-liste/

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Supposons que l'instruction lstA = lstB; soit acceptée. Alors les références lstA et lstB pointeraient vers la même liste.
    La listelstA étant déclarée comme une Liste<A>, tu pourrais y ajouter n'importe quel objet de type A, même s'il ne s'agit pas d'un objet de type B.
    Ce qui reviendrait à ajouter un objet de type A (non B) dans lstB (=lstA) alors que lstB est une Liste<B>. Problème.

    Voilà pourquoi le compilateur ne peut pas accepter de "caster" en Liste<A> une liste initialement déclarée comme Liste<B>.


    EDIT
    Si je n'ai pas réussi à être claire, voici le message que j'ai tenté de copier de mémoire : http://www.developpez.net/forums/d93...e/#post5271795

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Ces erreurs sont normales. Sans cela on pourrait faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    List<B> lstB = new ArrayList<B>();
    List<A> lstA = (List<A>)lstB;
     
    lstA.add(new A()); // on ajoute un A dans une List<A>
     
    B b = lstB.get(0); // on récupère un élément de type B
    comme lstA et lstB référence la même liste, on aurait dans les deux cas un objet de type A... alors que lstB ne l'autorise pas...

    Bref autoriser cela reviendrait à avoir un code non typesafe, alors que c'est là tout l'intérêt des Generics...




    Pour palier à cela il faut utiliser les wildcards pour définir un type partiel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	List<B> lstB = new ArrayList<B>();
    	List<? extends A> lstA = lstB;
    Ici lstA contient des éléments de type A ou enfant, mais dont tu ne connais pas précisément le type. Cela permet de faire des traitements génériques sans risque de problème (tu ne peux pas faire de add() par exemple, puisque tu ne connais pas le type réel à utiliser).


    Tu peux également faire l'inverse avec super, mais les cas d'utilisation sont plus rare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	List<A> lstA = new ArrayList<A>();
    	List<? super B> lstB = lstA;
    a++

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Par défaut
    Merci pour toutes ses infos, c'est plus clair.

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

Discussions similaires

  1. Questions sur la compatibilité et les version de VB
    Par jam92400 dans le forum Discussions diverses
    Réponses: 22
    Dernier message: 08/04/2008, 16h19
  2. Questions sur la navigation dans les répertoires
    Par belle5656 dans le forum Langage
    Réponses: 86
    Dernier message: 03/11/2007, 20h44
  3. Réponses: 2
    Dernier message: 28/07/2007, 01h21
  4. 3 questions sur le web et les technologies associées
    Par amazircool dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 20/07/2007, 00h16
  5. Des questions sur le C et les jeux (et interfaces)
    Par straitch dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 02/07/2007, 17h21

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