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 de type générique.


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Par défaut Cast de type générique.
    Bonjour à tous,

    voilà, ma question est très simple. Pourquoi ne puis-je pas effectuer un cast
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ArrayList<ArrayList<Truc>> ar = ...;
    Collection<Collection<Truc>> col = (Collection<Collection<Truc>>)ar; //ne fonctionne pas
    alors que le cast suivant fonctionne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ArrayList<Truc> ar = ...;
    Collection<Truc> col = (Collection<Truc>)ar; //fonctionne
    Plus particulièrement, mon problème est le suivant:
    J'ai une méthode dans un interface ayant pour type de retour Collection<Collection<Truc>>.
    Dans les classes l'implémentant, il est nécessaire de la surcharger.
    Ces classes travaillent de manière interne avec des ArrayList<ArrayList<Truc>>
    Je ne peux pas faire de cast pour le retour, et la jvm ne semble pas "comprendre" que c'est bon d'un point de vue de types.

    Pourquoi ? Comment faire pour éviter ça ?

    Merci d'avance pour vos réponses.

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    bonne question !

    après quelques recherches pour comprendre ce problème, je suis tombé sur cette discussion, en particulier le point 5

    de ce que j'ai compris, le cast tel que tu l'as écrit n'est pas autorisé pour éviter d'ajouter des éléments de type différents.

    il est aussi donné 2 façons de résoudre le problème, bonne lecture

  3. #3
    Membre éclairé Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Par défaut
    Ok....
    Je comprends pas trop en quoi l'utilisation des types jokers résout mon problème, mais il s'avère que c'est le cas. Je connaissais ça, mais je vois pas en quoi ça change qqch, raison pour laquelle j'avais même pas testé ça.

    Toujours est-il que le code de l'interface en question devenant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Collection<? extends Collection<? extends Truc>> partition();
    je peux maintenant surcharger "bêtement" de la manière suivane :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Collection<? extends Collection<? extends Vertex>> partition()
    {
        ArrayList<ArrayList<Truc>> ar = .....;
        return ar; //fonctionne
    }
    Merci donc ;-)

  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
    Si tu ne comprends pas la solution, ça veut dire que tu n'as pas compris le problème.

    ar dit qu'il contient des ArrayList<Truc>. Une Collection<Truc> n'est pas un ArrayList<Truc>. Bon, elle peut l'être parfois, mais elle peut tout aussi bien être un HashSet<Truc>.
    Donc ar ne peut pas accepter des Collection<Truc>, puisque ce qu'il contient c'est des ArrayList<Truc>, et qu'un Collection<Truc> n'est pas un ArrayList<Truc>.

    Or tu as décidé que col dit qu'il contient des Collection<Truc>, il peut donc en accepter. col peut accepter des Collection<Truc>, mais ar ne le peut pas.
    Ils ne peuvent donc pas être un seul et même objet, puisque l'un peut contenir des trucs que l'autre ne peut pas. Donc on ne peut pas cast ar en col.

    Par contre, en passant de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collection<Collection<Truc>> col;
    à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collection<? extends Collection<Truc>> col;
    tu passes de "col contient des Collection<Truc>" à "on ne sait pas ce que contient col mais on sait que c'est un sous-type de Collection<Truc>".
    On ne sait pas ce que contient col et donc on ne peut rien ajouter dedans, puisque quoi que ce soit qu'on veuille ajouter dedans, on ne sait pas si on peut le faire.

    Par contre, quoi qu'il y ait dedans, on sait qu'on peut le considérer comme un Collection<Truc>. ar aussi est capable de ça. Donc on peut cast ar en col.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    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
    Citation Envoyé par Razgriz Voir le message
    Bonjour à tous,

    voilà, ma question est très simple. Pourquoi ne puis-je pas effectuer un cast
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ArrayList<ArrayList<Truc>> ar = ...;
    Collection<Collection<Truc>> col = (Collection<Collection<Truc>>)ar; //ne fonctionne pas
    dans ar, tu peux uniquement mettre des ArrayList<Truc>, dans col, tu peux aussi mettre des LinkedList<Truc>, ce qui pose problème et n'est donc pas la même chose.

    Ceci dit, tu veux peux être exprimer que "quand je ferais un get sur les objet de col, je récupère une collection, je m'en fou de savoir si c'est une arraylist, une linkedlist, un hashset, etc. Dans ce cas, utiliser ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ArrayList<ArrayList<Truc>> ar = ...;
    Collection<? extends Collection<Truc>> col = ar;
    edit: ha ben t'as trouvé tout seul finalement

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

Discussions similaires

  1. Cast sur un type générique
    Par debloc dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 31/10/2012, 22h23
  2. [C#] Problème de Cast sur un type générique
    Par Bobbledople dans le forum C#
    Réponses: 2
    Dernier message: 10/06/2009, 11h04
  3. [VB.Net] cast du type 'DataRowview' en type 'Date' non valide
    Par badnane2 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/06/2006, 15h50
  4. y a-t-il un support de types génériques pour python ?
    Par silverhawk.os dans le forum Général Python
    Réponses: 15
    Dernier message: 24/03/2006, 18h23
  5. [C#] Cast et Types again
    Par BoeufBrocoli dans le forum Windows Forms
    Réponses: 9
    Dernier message: 11/01/2006, 22h31

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