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 :

Conversion type fils dans type pere


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Points : 62
    Points
    62
    Par défaut Conversion type fils dans type pere
    Bonjour,
    Prenons un type pere Vehicule et un type fils Camion,
    Il est posible bien evidement de mettre une variable Camion dans une variable Vehicule (Si celui ci n'est pas abstrait). Ca a un nom d'ailleurs cette operation, je me trompe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Vehicule v = new Camion ();
    Mais j'ai ete surpris de ne pas pouvoir faire l'operation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ArrayList<Vehicule> v = new ArrayList<Camion>();
    Quelqu'un peut m'eclaircir sur ce point ? J'ai du les convertir en Array pour que cela passe...
    Merci !

  2. #2
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut
    Salut,

    alors je te laisse te référer aux tutoriels pour de plus amples explications, ta 'solution' est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ArrayList<? extends Vehicule> v = new ArrayList<Camion>();

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Pourquoi tu ne fais pas celà tout simplement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Vehicule> v = new ArrayList<Vehicule>();
    Je ne vois pas ce que peut t'apporter de mettre le Camion à ce niveau ?

    Après tu peux faire :


  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dr@ke Voir le message
    Il est posible bien evidement de mettre une variable Camion dans une variable Vehicule (Si celui ci n'est pas abstrait). Ca a un nom d'ailleurs cette operation, je me trompe ?
    Cela s'appelle un upcast

    Citation Envoyé par Dr@ke Voir le message
    Mais j'ai ete surpris de ne pas pouvoir faire l'operation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ArrayList<Vehicule> v = new ArrayList<Camion>();
    Quelqu'un peut m'eclaircir sur ce point ? J'ai du les convertir en Array pour que cela passe...
    C'est tout à fait normal car si un véhicule peut être un camion, une liste de véhicule n'est pas une liste de camion.

    Et les Generics apportent la sécurité des types à la compilation alors que les tableau provoqueront une erreur à l'exécution. Pour bien montrer le problème on va utiliser une nouvelle classe Tricycle qui étendra également Vehicule.

    Avec les tableaux tu as le droit de faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Camion[] camions = new Camion[5];
    	Vehicule[] vehicules = camions;
    Car en fait toutes les vérifications des modifications du tableau sont effectué à l'exécution, et si tu as le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	vehicules[0] = new Tricycle();
    Le code compilera parfaitement, mais tu auras une ArrayStoreException à l'exécution car tu tentes de mettre un Tricycle dans un tableau de Camion...


    Les Generics apportent ce problème à la compilation et permettent donc d'avoir un code plus sécurisé, c'est pourquoi le code suivant génère une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	List<Camion> camions = new ArrayList<Camion>();
    	List<Vehicule> vehicules = camions; // ERREUR DE COMPILATION
    Ce qui fait qu'il est impossible de polluer la liste de Camion avec un Trycycle, sans que cela ne provoque une erreur ou un warning à la compilation...


    Par contre on peut utiliser les wilcards pour utiliser une pseudo-liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	List<Camion> camions = new ArrayList<Camion>();
    	List<? extends Vehicule> vehicules = camions; //OK !
    List<? extends Vehicule> signifie qu'on manipule une liste de Vehicule dont on ne connait pas le type précis.
    Cette syntaxe bloque l'utilisation de toutes les méthodes où le type précis est nécessaire, c'est à dire toutes les méthodes qui attendent le type paramétré en paramètre. Il sera donc impossible d'utiliser la méthode add(E) par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vehicules.add(new Camion()); // ERREUR, car avec <? extends Vehicule> on ne connait pas le type précis
    Par contre on pourra très bien utiliser toutes les autres méthodes, y compris celle qui retourne un élément <E> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vehicule v = vehicules.get(0); // Retourne un Vehicule car on ne connait pas le type précis, mais on sait qu'il étend Vehicule


    On peut également utiliser la syntaxe inverse (<? super Camion> par exemple) qui empêche l'utilisation des méthodes retournant un type paramétré (car son type précis est inconnu).



    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Points : 62
    Points
    62
    Par défaut
    Merci de vos reponses ! tres precises et completes !
    Je voulais juste preciser que je ne voulais pas faire (qui ne sert en effet a rien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ArrayList<Vehicule> v = new ArrayList<Camion>();
    Mais appeler une fonction prenant en parametre une liste de Vehicule avec une liste de camion. Je voulais simplifier l'explication en mettant cette ligne de code (qui a induit en erreur :/).

    En gros, j'ai des listes de camions, tricycles,.. et j'appele une fonction qui effectue le meme traitement pour tous ces types de vehicules et je bloquais a cet endroit !

    Merci.

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dr@ke Voir le message
    En gros, j'ai des listes de camions, tricycles,.. et j'appele une fonction qui effectue le meme traitement pour tous ces types de vehicules et je bloquais a cet endroit !
    Il faut donc utiliser List<? extends Vehicule>

    a++

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Points : 62
    Points
    62
    Par défaut
    C'est exactement ca

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

Discussions similaires

  1. Recherche dans XMLTYPE de PERE/FILS de type 0..n
    Par Hobbi1 dans le forum Oracle
    Réponses: 2
    Dernier message: 28/05/2013, 09h05
  2. Réponses: 22
    Dernier message: 04/03/2013, 17h07
  3. Requete pere/fils selon type
    Par hwoarang dans le forum Développement
    Réponses: 8
    Dernier message: 15/12/2010, 10h08
  4. utilisation de "LIKE" avec un type datetime dans r
    Par ericmart dans le forum Langage SQL
    Réponses: 8
    Dernier message: 06/11/2003, 14h58
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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