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 :

Collection d'objet et héritage


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 53
    Par défaut Collection d'objet et héritage
    Bonjour à tous,

    Je suis en train de nettoyer le code d'une application développée initialement en Java 1.4 et je me retrouve avec un problème que certains on sans doute déjà rencontré.

    Pourquoi n'est-il pas possible de déclarer : "List<A> liste = new ArrayList<B>()" avec B implémentant A ?

    Merci d'avance pour toute information.

    Exemple :
    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
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class TestList {
     
    	public static void main(String[] args) {
     
    		A monA = new B() ; 
    		// Ok
     
    		List<A> liste = new ArrayList<B>() ; 
    		// Erreur à la compilation : Type mistmach : cannot convert ArrayList<B> to List<A>
    	}
     
    	static interface A {
    		// Nop	
    	}
     
    	static class B implements A {
    		// Nop
    	}
    }

  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,


    Si cela était autorisé, on pourrait utiliser le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<A> liste = new ArrayList<B>();
     
    list.add( new A() ); // correct ou pas ?
    Pour le compilateur c'est tout à fait correct (on ajoute un objet de type A dans une List<A>. Mais à l'exécution cela devrait générer une erreur puisque en réalité on a une ArrayList<B>.

    Bref la vérification du typeage serait faite à l'exécution (comme c'est le cas pour les tableaux) alors que l'objectif même des Generics est de vérifier les types à la compilation pour produire un code sécurisé...

    a++

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je rajouterais pour plus de précisions:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List<A> x;
    ArrayList<B> z = new ArrayList<B>();
    x=y;
    x.add(new A());
    for (B myB:z){
        // erreur quand on sertira la A :aie:
    }

    Le plus simple avec les generics, c'est de penser absence d'héritage. Tu ne peux pas substituer une List<A> à une List<B>

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 53
    Par défaut
    Ok, j'ai compris. Merci pour les exemples.

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

Discussions similaires

  1. Problème de gestion d'une collection d'objet
    Par poolky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/02/2006, 21h51
  2. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11
  3. Probléme collection d'objets
    Par Contrec dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 10h08
  4. [Reflexivite]création dynamique d'objet et Héritage
    Par norkius dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 26/10/2004, 11h37
  5. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58

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