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 :

Cast et extends


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut Cast et extends
    Bonjour,

    Alors j'ai souci avec les cast.
    C'est pas trop compliqué à comprendre mais à expliquer, c'est autre chose...
    Voici donc un exemple, qui sera plus parlant :

    - J'ai une classe de base, MyClass, qui définit des méthodes de base pour un objet quelconque.
    - Une autre classe MyClassExtended extends MyClass est définie pour y ajouter d'autre méthodes, qui seront utilisées pour une application bien précise.
    - J'ai aussi une classe "outil" MyClassTools qui permet, par exemple, de gérer des tableau de MyClass, etc.
    Dans cette classe justement, il existe une méthode retournant un tableau de MyClass, qu'on appelera simplement myMethod(). Mon problème est le suivant :
    J'utilise un tableau de MyClassExtended.
    Si je veux utiliser myMethod() pour ce tableau, comment doit-je m'y prendre ?
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyClassExtended []tab = (MyClass) myMethod();
    et forcément, ça ne marche pas.

    En fait je voudrai surtout que myMethod() retourne n'importe quelle classe extends MyClass, si vous voyez ce que je veux dire. Un peu comme ArrayList<? extends MyClass>, mais en tableau...

    Note : dans myMethod(), j'utilise bien sûr qu'uniquement les méthodes de MyClass...

    J'espère m'avoir fais comprendre.
    Merci !

  2. #2
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Bah, utilise le type MyClass[], tu pourras y mettre des objets de type MyClassExtended...

  3. #3
    Membre éprouvé Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    C'est bien là, le hic.
    myMethod() retourne MyClass[],
    A la compilation, c'est ok,
    A l'exécution, j'ai un ClassCastException...

    ???

    Edit : Autant pour moi. Je viens de piger ce que tu voulais dire. En fait, t'as tout a fait raison. Trop de Java fait s'embrouiller... Pfff... "Mais c'est bien sûr ! Où avais-je la tête".

    Repos pour moi.
    Merci !

  4. #4
    Membre éprouvé Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    Par contre, tant que j'y suis :
    Y a t-il d'autres possibilités que celle-ci ?
    Je veux dire, y a t-il un moyen d'éviter le cast à chaque fois que je veux accéder à ma MyClassExtended ?

    J'ai par exemple un souci pour le parcours du tableau :
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyClass[] tab = [tableau de MyClassExtended];
    for(MyClass c : tab)
    c ne peut pas être casté à MyClassExtended,
    et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyClass[] tab = [tableau de MyClassExtended];
    for(MyClassExtended c : (MyClassExtended[]) tab)
    de même, j'ai toujours un ClassCastException.

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par BlackWood
    Par contre, tant que j'y suis :
    Y a t-il d'autres possibilités que celle-ci ?
    Je veux dire, y a t-il un moyen d'éviter le cast à chaque fois que je veux accéder à ma MyClassExtended ?

    J'ai par exemple un souci pour le parcours du tableau :
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyClass[] tab = [tableau de MyClassExtended];
    for(MyClass c : tab)
    c ne peut pas être casté à MyClassExtended,
    et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyClass[] tab = [tableau de MyClassExtended];
    for(MyClassExtended c : (MyClassExtended[]) tab)
    de même, j'ai toujours un ClassCastException.
    Non, mais tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(MyClass mc : tab) {
        //Ne marche que si le tableau ne contient que des MyClassExtended
        MyClassExtended mce = (MyClassExtended) mc;
        ...
    }
    Quand tu réfléchis, c normal...
    Mais si tu veux absolument ne mettre que des MyClassExtended dans ton tableau, pourquoi tu n'utiliserais pas qu'un tableau de MyClassExtended (sans te préoccuper de MyClass)?

  6. #6
    Membre éprouvé Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    Citation Envoyé par ®om
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(MyClass mc : tab) {
        //Ne marche que si le tableau ne contient que des MyClassExtended
        MyClassExtended mce = (MyClassExtended) mc;
        ...
    }
    Non justement ! Ceci lance une ClassCastException ! C'est d'ailleurs étonnant, mais peut-être est-ce ce nouveau for(...) et qu'avec un bon vieux for(int i=0;i....), ça marchera. Je vais essayer.

    Citation Envoyé par ®om
    Mais si tu veux absolument ne mettre que des MyClassExtended dans ton tableau, pourquoi tu n'utiliserais pas qu'un tableau de MyClassExtended (sans te préoccuper de MyClass)?
    On en reviendrai à mon premier problème !

    Note : Mon tableau ne contient bien QUE des MyClassExtended.

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

Discussions similaires

  1. Probleme CAST
    Par cedric31 dans le forum SQL
    Réponses: 2
    Dernier message: 16/02/2004, 11h46
  2. Problème lors du EXTEND d'un tableau
    Par banana31 dans le forum Oracle
    Réponses: 14
    Dernier message: 10/02/2004, 11h58
  3. CAST ou autre ?
    Par 74160 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2003, 16h00
  4. CAST DATETIME ----> SMALLDATETIME
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2003, 13h07
  5. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 16h49

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