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

Langage Java Discussion :

Generics et Héritage


Sujet :

Langage Java

  1. #1
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut Generics et Héritage
    Soit 3 classes A1, B1 et C1, B1 et C1 héritant toutes 2 de A1.
    Soit 3 autres classes A2, B2 et C2, B2 et C2 héritant toutes 2 de A2.

    J'ai une méthode qui prend en paramètre une collection ne contenant que des éléments de type B1 ou que des éléments de type C1. Elle renvoit une collection ne contenant soit que des éléments de type B2 (si la collection passée en paramètre ne contient que des éléments de type B1), soit que des éléments de type C2.

    J'aimerai donc avoir une signature de la sorte (qui a du sens pour moi, mais je dois mal concevoir la chose...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Collection<A2> foo (Collection<A1> collection);
    Cependant, je ne peux pas lui passer une Collection<B1> ou Collection<C1> en paramètre, de même que je ne peux pas caster le retour en Collection<B2> ou Collection<C2>...

    Puis-je faire quelque chose de similaire proprement ?

    Je précise que je comprends tout à fait pourquoi cela ne marche pas, mais je ne vois pas comment faire pour faire fonctionner un truc du genre... Est-ce possible ?

    Merci pour votre aide...

  2. #2
    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,


    Ce n'est pas très clair... J'ai du mal à voir les relations entre A1 et A2 (ni entre les autres d'ailleurs), ni ce que tu veux faire exactement...

    Essayes d'être plus précis... Comment du coderais ceci sans Generics ? (au passage on ne parle pas de Template mais de Generics )

    a++

  3. #3
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Sans generics, je n'aurai pas de problème en fait ^^

    J'utiliserai des simples collection d'objets...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public abstract class A1{
       // redéfinie dans B1 et C1... Pour B1 renvoie un objet de type B2, pour C1 renvoi un objet de type C2...
       public abstract A2 bar();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Collection foo(Collection c){
       ArrayList a = new ArrayList();
       for (Object o : c)
          a.add(((A1)o).bar());
     
       return a;
    }
    Ce qui fait donc que ma Collection de retour ne contient soit que des B2 soit que des C2... Est-ce incorrect de penser une méthode de la sorte ?

  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
    Ben il suffit de typer ton code, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public Collection<A2> foo(Collection<A1> c) {
    		ArrayList<A2> a = new ArrayList<A2>();
    		for (A1 o : c) {
    			a.add(o.bar());
    		}
    		return a;
    	}

    a++

  5. #5
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Oui on est d'accord, mais je ne peux pas écrire ça apres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Collection<B1> c = ....
       ...
       foo(c);
    Type incompatible me dit le compilateur... la méthode doo(Collection<A1>) n'est pas compatible avec l'argument Collection<B1>...

    Et c'est pourtant ce que j'aimerai faire...

  6. #6
    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
    Ah ok j'ai compris ton problème !

    Cette erreur est normal car Collection<A1> est différent de Collection<B1> même si B1 hérite de A1.

    Pour faire ce que tu souhaites tu dois utiliser les wildcards :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public static Collection<A2> foo(Collection<? extends A1> c) {
    		ArrayList<A2> a = new ArrayList<A2>();
    		for (A1 o : c) {
    			a.add(o.bar());
    		}
    		return a;
    	}
    a++

  7. #7
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut


    Ah oui, jamais utilisé ça encore !

    Merci beaucoup pour m'avoir compris et aidé !

  8. #8
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Dernier petit point. Voici la méthode donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public static Collection<? extends A2> foo(Collection<? extends A1> c) {
    		ArrayList<A2> a = new ArrayList<A2>();
    		for (A1 o : c) {
    			a.add(o.bar());
    		}
    		return a;
    	}
    en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Collection<B1> c1 = ...
       ...
       Collection<B2> c2 = foo(c1);
    Je dois caster en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collection<B2> c2 = (Collection<B2>)foo(c1);
    J'ai alors un warning, me disant, si je comprends bien, qu'il ne peut pas garantir que ma collection retournée ne possède en effet que des objets de type B2... Ok, mais pourquoi avoir un warning pour un cast de la sorte et pas pour un simple cast (en effet, pour un simple cast, le compilateur ne peut pas me garantir que je ne vais pas me prendre un ClassCastException, mais je n'ai pas de warning pour autant)...

    Je précise que je suis sous Eclipse... Est-ce Eclipse qui a décidé de mettre un warning pour ce genre de cast, où est-ce que c'est une norme ?

  9. #9
    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
    Citation Envoyé par Claythest
    Je précise que je suis sous Eclipse... Est-ce Eclipse qui a décidé de mettre un warning pour ce genre de cast, où est-ce que c'est une norme ?
    C'est normal !

    [edit] Désolé j'ai posté trop vide

    La compilation des Generics implique que les classes typés ne génèreront aucune ClassCastException à l'exécution...

    Si ce n'est pas le cas un warning doit être affiché !
    En effet le problème est que le ClassCastException surviendrait plus loin dans le code et non pas sur le cast lui-même, et serait donc plus difficilement décelable...



    Mais que veux-tu faire exactement avec ce mécanisme ! Il y a surement une meilleure facon de faire...

    a++

  10. #10
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par adiGuba
    La compilation des Generics implique que les classes typés ne génèreront aucune ClassCastException à l'exécution...
    Ok c'est bien cela que je voulais savoir

    Encore merci adiGuba

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

Discussions similaires

  1. Problème avec les Generics et héritage
    Par jojodu31 dans le forum Langage
    Réponses: 5
    Dernier message: 17/06/2010, 10h04
  2. Generics et héritage
    Par Anonymouse dans le forum Langage
    Réponses: 4
    Dernier message: 01/10/2008, 16h45
  3. [Generics] Sur class plus héritage
    Par anthyme dans le forum C#
    Réponses: 1
    Dernier message: 24/09/2007, 23h03
  4. Generics et héritage avec Java 5.0 Tiger
    Par euyeusu dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2007, 11h41
  5. [Java5] Generics et Héritage
    Par denisC dans le forum Langage
    Réponses: 1
    Dernier message: 09/05/2006, 14h54

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