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 :

Problème asList et héritage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut Problème asList et héritage
    Bonjour,

    J'ai un petit soucis avec asList :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public static void main(String[] args) {
            List<Class<? extends ClassMere>> L = Arrays.asList(ClassFille.class,ClassFille.class);
        }
     
        public static class ClassMere {}
        public static class ClassFille extends ClassMere {}
    J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types
      required: java.util.List<java.lang.Class<? extends test.Main.ClassMere>>
      found:    java.util.List<java.lang.Class<test.Main.ClassFille>>
            at test.Main.main(Main.java:41)

  2. #2
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Bonjour,
    Dans l'écriture :
    List<Class<? extends ClassMere>> L = Arrays.asList(ClassFille.class,ClassFille.class);
    ClassFille hérite de ClassMere donc ClassFille est une ClassMere et le ? est respecté.
    C'est Ok :
    Class<? extends ClassMere> m=ClassFille.class;
    Par contre, une liste de ClassFille n'est pas une Liste de ClassMere. List<ClassFille> n'est pas Compatible avec List<ClassMere>.
    Il n'y a pas de covariance sur les generics, et tu dois l'introduire explicitement à nouveau avec le joker ?

    List<? extends Class<? extends ClassMere>> L = Arrays.asList(ClassFille.class,ClassFille.class);

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Wow... Alors là j'ai du mal. Effectivement, ça a l'air de marcher, mais pourquoi ?

    List<? extends Class> Ca veut pas dire une liste d'objets qui héritent de Class ?

    D'autre part, regardez le code suivant quand j'ai plusieurs classes filles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public static void main(String[] args) {
            List<Class<? extends ClassMere>> L1 = Arrays.asList(ClassFille1.class,ClassFille2.class);//Pas d'erreur
            List<Class<? extends ClassMere>> L2 = Arrays.asList(ClassFille1.class,ClassFille1.class);//Erreur
     
        }
     
        public static class ClassMere {}
        public static class ClassFille1 extends ClassMere {}
        public static class ClassFille2 extends ClassMere {}
    Une explication ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Arrays.asList(ClassFille1.class,ClassFille1.class);
    renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Class<ClassFille1>>
    Tu ne peux pas associé List<Class<ClassFille1>> à ça List<Class<? extends ClassMere>>, ce n'est pas la même chose. La première dit que tu as une liste qui accepte que des ClassFille1, et toi tu dit que tu as une liste qui accepte n'importe classe fille de ClassMere.

    De toute façon tu ne peux pas effectuer d'opérations sur la liste retournée par un Arrays.asList. Cette fonction te renvoie une liste dont les méthodes add, remove, etc... te throw une UnsupportedOperationException. Donc soit tu ne souhaites pas faire de add, remove, ... et à ce moment là tu peux typer comme le compilateur te le demande en List<Class<ClassFille1>>, soit tu souhaites ajouter des éléments à ta liste de façon dynamique et à ce moment là tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<Class<? extends ClassMere>> liste = new ArrayList<Class<? extends ClassMere>>();
    liste.add(ClassFille1.class);
    liste.add(ClassFille1.class);
    Romain.

  5. #5
    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
    Sinon il y a juste Arrays.<Class<? extends ClassMere>>asList(ClassFille.class,ClassFille.class); mais ça commence à être assez lourdingue.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public static void main(String[] args) {
            List<Class<? extends ClassMere>> L1 = Arrays.asList(ClassFille1.class,ClassFille2.class);//Pas d'erreur
            List<Class<? extends ClassMere>> L2 = Arrays.asList(ClassFille1.class,ClassFille1.class);//Erreur
     
        }
    Une explication ?
    Pour comprendre, il faut regarder la signature de asList : public static <T> List<T> asList(T... a)On voit que le type de List renvoyé dépend des parametres passés à la fonction. Dans le cas ou on passe plusieurs objets de meme type, on va se retrouver une liste du type des objets passés en parametre. En revanche, si on passe des objets de type différent, asList renvoie une liste qui étend le premier pere commun. Si on reprend tes exemples, quand tu passes 2 fois ClassFille1.class, le plus proche pere commun est ClassFille1 donc asList renvoie List<Class<ClassFille1>> qui est incompatible avec List<Class<? extends ClassMere>>. En revanche, quand tu passes ClassFille1.class,ClassFille2.class, le plus proche pere commun est ClassMere donc asList renvoie List<Class<? extends ClassMere>>.

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    D'accord, d'accord. C'est plus clair comme ça.

    Mais alors, quid de la réponse de kox2ee :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<? extends Class<? extends ClassMere>> L = Arrays.asList(ClassFille.class,ClassFille.class);
    En particulier le ? extends Class

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

Discussions similaires

  1. problème avec mcd héritage
    Par minooo dans le forum Schéma
    Réponses: 4
    Dernier message: 16/01/2008, 09h57
  2. problème sur un héritage de combobox
    Par azräel dans le forum MFC
    Réponses: 4
    Dernier message: 27/06/2007, 10h17
  3. Problème concernant l'héritage
    Par Premium dans le forum C++
    Réponses: 3
    Dernier message: 17/03/2007, 02h15
  4. [VC++] Problème avec un héritage
    Par Freakazoid dans le forum Visual C++
    Réponses: 7
    Dernier message: 28/11/2005, 08h35
  5. [DEBUTANT] Probléme avec l'héritage
    Par BRAUKRIS dans le forum Langage
    Réponses: 7
    Dernier message: 16/09/2005, 20h22

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