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

Collection et Stream Java Discussion :

Tableau de généric en retour de méthodes


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    919
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 919
    Par défaut Tableau de généric en retour de méthodes
    Je viens de relire la faq d'Angelika Langer sur les générics, mais je n'y ai pas vu d'explication à pourquoi je reçois une erreur de compilation dans ce cas de figure:
    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
     
    Class UneClasse {
       Tag[] tags=new Tag[0];
       Filler<Tag> filler=new Filler<Tag>();
     
       public dofill() {
              tags=filler.getfill();
              }  
    }   
     
    Class Filler<T> {
       ...
       public T[] getfill() {
              return ...
              }  
    }
    La compilation me retourne une erreur sur tags=filler.getfill(). Je ne comprends pas car tout coïncide, il n'y pas d'héritage, de cast foireux...

    Pour le moment, pour que ça passe sans erreurs et warning, j'ai écris cette horeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tags=Arrays.asList(filler.getfill()).toArray(new Tag[0]);
    Si c'est la seule solution, c'est plutôt

    Merci.

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Est ce que tu pourrait poster un code minimum exact permettant de reproduire ton problème, car je vois plusieurs erreurs dans le code que tu as posté (class avec une majuscule, méthode sans type de retour). Cependant la ligne que tu indiques en erreur m'a l'air bonne.

  3. #3
    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
    Comme dit Uther, il n'y a pas d'erreur sur la ligne indiquée.

    Mais je confirme que mêler tableaux et génériques, c'est la plaie. Il vaut mieux se baser sur Arrays.asList() et Collection.toArray(). (Mais pour passer de l'un à l'autre, pas dans la même instruction, évidemment.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    919
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 919
    Par défaut
    A la demande générale, voici le code incriminé:
    1) Le composant Swing avec Generic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class ZTagField<T> extends JTextPane {
        public ZTagField(List<T> sourceitems, StringBasedFactory<T> factory) {
            this(factory);
            setSourceItems(sourceitems);
        }
        public void setSourceItems(List<T> sourceitems) {
    		...
        }
        T[] arrItems = null;
        public T[] getItems() {
            if (rebuild) arrItems=...
            return arrItems;
        }
    2) La classe appelante
    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
    public class clTagChooser {
        ZTagField<clTag> txtTags = null;
        public clTagChooser(clArchive archive) {
            super();
            ...
        }
        protected void initBaseComponents() {
            // Le textpane, qu'on customise après
            txtTags = new ZTagField<clTag>(tagfactory);
        }
    	/** 
         * Retourne les items sélectionnés
         * @return clTag[]
         */
        public clTag[] getSelectedTags() {
            return txtTags.getItems(); // ?? retourne [Object cannot be cast to [clTag ????
            /** @todo Revoir cette horreur, mais c'est quoi encore que ce problème de cast ??? */
            //return Arrays.asList(txtTags.getItems()).toArray(new clTag[0]);
        }
    Contrairement à ce que j'avais dit, ça plante au runtime sur le return txtTas.getItems() avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.ClassCastException: [Ljava.lan.Object; cannot be cast to [Lcom.zploger.Compute.clTag;

  5. #5
    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
    Apparemment, arrItems est un Object[], il ne peut pas être casté en clTag[].

    Comment initialises-tu ce tableau ? De quelle façon serait-il censé savoir qu'il doit être de type clTag ?

    (Et pourquoi ça ne s'appelle pas simplement items et Tag, boudiou ? D'ailleurs les noms de classes et interfaces sont censés commencer par une majuscule.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    919
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 919
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Apparemment, arrItems est un Object[], il ne peut pas être casté en clTag[].
    Comment initialises-tu ce tableau ? De quelle façon serait-il censé savoir qu'il doit être de type clTag ?
    Parce que le tableau est de type T et que T est défini lors de l'instanciation de la classe en "new ZTagField<clTag>(...)"... sauf si je ne comprends toujours rien aux Generics...

    Citation Envoyé par thelvin Voir le message
    (Et pourquoi ça ne s'appelle pas simplement items et Tag, boudiou ? D'ailleurs les noms de classes et interfaces sont censés commencer par une majuscule.)
    Convention personnelle...

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/11/2007, 00h50
  2. Structure: Retour de méthode
    Par abcdefghijk dans le forum C++
    Réponses: 11
    Dernier message: 06/09/2007, 15h27
  3. Réponses: 8
    Dernier message: 19/07/2007, 16h40
  4. [Objet] Conseil retour de méthode
    Par charlene44 dans le forum Delphi
    Réponses: 10
    Dernier message: 06/03/2007, 09h57
  5. reflexion et type de retour des méthodes
    Par money mark dans le forum Langage
    Réponses: 2
    Dernier message: 09/04/2006, 18h46

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