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

avec Java Discussion :

Instanciation avec JOKER


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 136
    Par défaut Instanciation avec JOKER
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    void f (List<? extends Figure> liste){
    
    //Autorisé
    
    Figure ret = liste.get(0);
    
    // Interdit par le compilateur
    
    Cercle ret = liste.get(0);
    
    }

    Cette méthode prend en paramètre une liste qui contient des éléments dont le type(inconnu) peut être un sous type de Figure ou peut être de type Figure.


    Or, Cercle est un sous type de Figure, alors pourquoi :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cercle ret = liste.get(0);

    est interdit par le compilateur ?

  2. #2
    Membre très actif
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Par défaut
    Parce que ton type de retour est un objet de type Figure justement !

    Un Cercle est une Figure mais une Figure n'est pas toujours un Cercle (c'est un problème d'implications/équivalences)

    Pour récupérer un Cercle, il faut vérifier d'abord que ça en est un, et lancer un cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Figure fig = liste.get(0);
    if (fig instanceof Cercle) { /* ici on vérifie que 'fig' est un cercle */
        Cercle cercle = (Cercle)fig; /* ici, on crée une nouvelle référence de type Cercle qui pointe le même objet comme un "Cercle cercle = liste.get(0)" */
        /* Ajoute ici le code à exécuter avec ton cercle */
    }
    /* Si tu as quelquechose à faire dans le cas ou ta figure n'est pas un cercle, rajoute un else */

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 136
    Par défaut
    Citation Envoyé par Grimly Voir le message
    Parce que ton type de retour est un objet de type Figure justement !

    Un Cercle est une Figure mais une Figure n'est pas toujours un Cercle (c'est un problème d'implications/équivalences)
    Oui je vois...Mais c'est le type retour de la fonction get qui est un objet de type Figure ?


    Suite à ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (List<? extends Figure> liste){
    on peut affirmer que liste peut contenir des objets de type Figure ou des objets qui sont sous type de Figure ?

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il y a deux points : ce que tu déclares, et ce que sont les choses.

    Par exemple, une table, tu peux dire que c'est un objet, tu peux dire que c'est un mobilier, etc. Quel que soit ce que tu dis, cela restera toujours une table.

    Techniquement, un objet a toujours une, et une seule, classe, qui ne change jamais, tandis qu'il peut avoir plusieurs déclarations compatibles acceptées par le test instanceof pour le runtime, par la théorie pour le compilateur.

    Cette compatibilité peut être dû à l'héritage (fils de... père de...), à une correspondance avec une interface, ou une correspondance avec une déclaration de type.

    La méthode list.get(0) déclare que le type de retour est le type paramétré pour l'objet list (E get(int index) dit le javadoc). Il peut arriver, par divers procédés, que la liste contienne des objets dont la classe est compatible, à la classe déclarée par le type E.

    Pour répondre plus directement à ta question, le type retour déclaré par list.get est Figure.

Discussions similaires

  1. Suppression de fichiers avec joker
    Par defluc dans le forum Langage
    Réponses: 4
    Dernier message: 20/10/2007, 17h28
  2. Recherche de fichier avec joker
    Par defluc dans le forum Langage
    Réponses: 1
    Dernier message: 15/10/2007, 12h27
  3. [MySQL] Équivalent d'un update replace avec joker
    Par Ryan Sheckler dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/05/2007, 15h32
  4. Équivalent d'un update replace avec joker
    Par Ryan Sheckler dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/05/2007, 10h55
  5. Comparaison de String avec jokers
    Par kitsune dans le forum Langage
    Réponses: 8
    Dernier message: 22/05/2006, 15h21

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