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 :

Joker et héritage


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Joker et héritage
    Bonjour ,

    Voici un code avec une méthode fill qui souhaite remplacer des fiat par des voitures

    çà coince à la compil au niveau de : liste.set(i, elem);

    Est-ce à cause de l'héritage ?

    Voiture = Fiat MAIS
    Fiat != Voiture

    Merci de me répondre

    Voici le code
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    package effacer;
     
     
    import java.util.ArrayList;
    import java.util.List;
     
    	class Voiture {	}
     
    	class Fiat extends Voiture
     
    	{
    		static <T> void fill(List<? extends T> liste, T elem)
    		{
    			int size = liste.size();
    			for (int i = 0; i < size; i++)
    			liste.set(i, elem);
     
    			for (int i = 0; i < size; i++)
    				System.out.println(liste.get(i));
    		}
     
    	}
     
     
    	public class aa {
     
    		public static void main(String[] args) {
     
    			Fiat fiat1 = new Fiat();
    			Fiat fiat2 = new Fiat();
    			Fiat fiat3 = new Fiat();
     
    			List<Fiat> fiats = new ArrayList<Fiat>();
    			fiats.add(fiat1);
    			fiats.add(fiat2);
    			fiats.add(fiat3);
     
    			Voiture voiture = new Voiture();
     
    			Fiat.<Voiture>fill(fiats,voiture);	
     
    		}
    	}

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Citation Envoyé par michelp3 Voir le message
    Voiture = Fiat MAIS
    Fiat != Voiture
    Cela serait plutot : Une Fiat est une voiture, mais une voitures n'est pas une fiat non ?

    Enfin sinon, un code qui marcherait au compilateur :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    import java.util.ArrayList;
    import java.util.List;
     
    	class Voiture {	}
     
    	class Fiat extends Voiture
    	{
    		static <T extends Voiture> void fill(List<T> liste, Voiture elem)
    		{
    			int size = liste.size();
    			for (int i = 0; i < size; i++)
    			liste.set(i, (T) elem);
     
    			for (int i = 0; i < size; i++)
    				System.out.println(liste.get(i));
    		}
    	}
     
    	public class aa {
     
    		public static void main(String[] args) {
     
    			Fiat fiat1 = new Fiat();
    			Fiat fiat2 = new Fiat();
    			Fiat fiat3 = new Fiat();
     
    			List<Fiat> fiats = new ArrayList<Fiat>();
    			fiats.add(fiat1);
    			fiats.add(fiat2);
    			fiats.add(fiat3);
     
    			Voiture voiture = new Voiture();
     
    			Fiat.<Fiat>fill(fiats,voiture);	
     
    		}
    	}
    Mais entres nous je me demande a quoi cela peut bien servir (sauf si c'est une exemple purement théorique)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut C'est un exercice
    tiré d'un cours sur la généricité (université de Nice) dont voici un extrait

    Autre exemple

    static <T> void
    fill(List<? extends T> liste, T elem) {
    int size = liste.size();
    for (int i = 0; i < size; i++)
    liste.set(i, elem);
    }

    Ca compile ?
    �� Cette méthode ne compile pas. Pourquoi ?

    Justement POURQUOI ?

  4. #4
    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
    Citation Envoyé par michelp3 Voir le message
    Cette méthode ne compile pas. Pourquoi ?
    List<? extends Machin> signifie essentiellement "une List dont on ne sait pas ce qu'elle contient, mais dont on sait qu'en tout cas ça étend Machin."

    Le concept-clé ici, c'est "on ne sait pas ce que contient la List."
    Si on ne sait pas ce qu'elle contient, on ne peut rien y mettre dedans, parce que pour tout objet qu'on voudrait mettre dedans, on ne sait pas si c'est un objet qu'on a le droit de mettre dedans.
    On en sait pas si on a le droit => on n'a pas le droit.

    De tout ça on peut déduire :
    - On ne peut jamais rien donner à un <? extends T>. On ne peut que lui prendre des T.
    - On ne peut jamais rien prendre à un <? super T>. On ne peut qui lui donner des T.
    - on peut prendre des T et donner des T à un <T>.
    - <?> est équivalent à <? extends Object>.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut thelvin
    Comme tjs grand merci thelvin

    Explication fouillée qui vaut la peine d'être lue

    Bon weekend !!!

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

Discussions similaires

  1. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  2. [Héritage] Vos commentaires....
    Par Fyna dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 03/05/2005, 22h10
  3. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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