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 :

Problème avec les Generics et héritage


Sujet :

Langage Java

  1. #1
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut Problème avec les Generics et héritage
    Bonjour à tous,
    je rencontre un petit soucis de compréhension avec les générics et un héritage :

    J'ai une classe abstraite PommeAbstraite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public abstract class PommeAbstraite {
     
    	public abstract void setPommes(List<? extends PommeAbstraite> pommes);
     
    	public abstract List<? extends PommeAbstraite> getPommes();
    }
    et une classe PommeGolden qui hérite de PommeAbstraite :
    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
     
    public class PommeGolden extends PommeAbstraite {
     
    	List<PommeGolden>	pommes;
     
    	@Override
    	public void setPommes(final List<PommeGolden> pommes) {
    		this.pommes = pommes;
    	}
     
    	@Override
    	public List<? extends PommeAbstraite> getPommes() {
    		return pommes; // fonctionne !!
    	}
    }
    Je n'ai pas d'erreur sur le getPommes .. pk??
    sauf que sur mon setPommes j'ai l'erreur suivante : The method setPommes(List<PommeGolden>) of type PommeGolden must override or implement a supertype method ...
    ça passe en mettant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	@Override
    	public void setPommes(final List<? extends PommeAbstraite> pommes) {
    		this.pommes = (List<PommeGolden>) pommes;
    	}
    mais c'est sensiblement moche, puisque l'on peut passer tout ce qui étend PommeAbstraite et pas seulement des PommeGolden.

    J'aimerais juste comprendre pourquoi ma première n'est pas bonne... vu que List<PommeGolden> devrait passer pour List<? extends PommeAbstraite>. Et pourquoi cela fonctionne pour le get alors que le principe est le même ?

    merci d'avance

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

    La classe PommeGolden hérite de la classe PommeAbstraite.
    Si elle redéfinit une méthode la classe mère, elle doit avoir la même signature.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 620
    Points
    21 620
    Par défaut
    Citation Envoyé par jojodu31 Voir le message
    vu que List<PommeGolden> devrait passer pour List<? extends PommeAbstraite>.
    Euh ? Non... C'est à peine si ça se ressemble.

    Citation Envoyé par jojodu31 Voir le message
    Et pourquoi cela fonctionne pour le get alors que le principe est le même ?
    Rien à voir. Le set prend un paramètre, le get renvoie une valeur.

  4. #4
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Certes, mais si je ne m'abuse les types ne sont pas conservés dans ce cas à la compilation donc je pensais que ça pouvait passer ... merci en tous cas

  5. #5
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Une solution consiste à justement rendre ta classe PommeAbstraite générique de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public abstract class PommeAbstraite<P> {
     
    	protected List<P> pommes;
     
    	public void setPommes(final List<P> pommes) {
    		this.pommes = pommes;
    	}
     
    	public List<P> getPommes() {
    		return pommes;
    	}
    	// definition d'eventuelle methodes abstraites
    }
    Ensuite la classe PommeGolden est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class PommeGolden extends PommeAbstraite<PommeGolden> {
    	// surcharche d'eventuelle methode abstraite et definition des methode spécifique à PommeGolden
    }

  6. #6
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Bonjour,
    en effet c'est la solution pour laquelle j'ai opté. Je n'avais pas fait comme ceci dans un premier temps car je ne voulais pas modifier les classes filles, mais pas le choix...
    merci à tous

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

Discussions similaires

  1. Problèmes avec les generics
    Par mehdi_swatch dans le forum Langage
    Réponses: 12
    Dernier message: 10/07/2006, 18h35
  2. [Problème] avec les generics
    Par Prodejeu dans le forum Langage
    Réponses: 6
    Dernier message: 29/06/2006, 12h48
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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