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

API standards et tierces Java Discussion :

add de ArrayList et la spécification du type de paramètre


Sujet :

API standards et tierces Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut add de ArrayList et la spécification du type de paramètre
    Bonne année 2010.

    Ma petite application utilise des objets de type 'ArrayList', surtout parce que cette classe permet l'incrémentation de la grandeur de la liste par actions successives après sa création. http://java.sun.com/javase/6/docs/api/ montre que je peux utiliser à cette fin la méthode 'add(E e)'.
    L'IDE que j'utilise est 'NetBeans IDE 6.5'.
    Mon objet de type 'ArrayList' est multi-dimensionnel et pour le construire, j'utilise une fontion réentrante. A la fin de celle-ci apparaît donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	chaîneCible.add(descendant);
    	return (chaîneCible);
    Dans 'chaîneCible.add(...',
    - si je ne stipule que l'objet à accrocher en fin de liste (descendant)
    - le précompilateur ne rouspète pas : ne souligne pas la ligne de commande en rouge
    alors qu'il manque dans la parenthèse le type de paramètre propre à 'descendant' - p.ex. String.
    - le débugger rouspète :
    Note: C:\Documents and Settings\Me\My documents\ApplicPrograms\Application7\src\package\NoeudàCaseàCocher.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.
    - si je stipule le type de paramètre propre à l'objet à accrocher en fin de liste - p.ex. BigDecimal -
    - le précompilateur rouspète : Il souligne la ligne de commande en rouge
    alors que l'API stipule qu'il faut spécifier le type de paramètre

    - Dans je ne sais plus quel cas, le compilateur m'a renvoyé
    Class 'ArrayList' - method 'add'
    automatic casting of a 'String' into an 'Object' is refuted at compilation
    Pourquoi ne sais-je pas spécifier le type de paramètre, comme l'API le demande ?
    Merci d'avance.

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Tu pourrais mettre ton code ?

    En particulier, tes déclaration de chaineCible et de descendant.

    Le plus simple pour que ça ne râle pas, si tu cases tout types d'objets, et de déclarer chaineCible comme une ArrayList<Object> ; charge à toi ensuite de faire les cast correspondant quand tu retires des objets de cette liste.

    Si tu as des interactions avec du code précédent la version 5, tu vas devoir forcer des List dans des List typées, et là tu vas devoir de toute façon générer un warning. Ce warning peut être ignoré avec @SuppressWarnings("unchecked").

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut add de ArrayList et la spécification du type du paramètre
    Rei Ichido-san, voici :
    Voici une réduction de code (121 lignes) de mon fichier source (1145 lignes) qui devrait bien marcher, excepté ce problème de spécification du type de l'objet à ajouter en fin de l'ArrayList. Il s'agit d'un 'parser' qui insère des Strings d'un fichier auxiiaire tout en 'parsant' un fichier principal (chaîneSource) et afin de générer un fichier cible (chaîneCible).
    Code réduit :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    package arbreformtarif;
     
    import java.util.ArrayList;
    import java.math.BigDecimal;
     
     
    class NoeudàCaseàCocher
    {
                       String       dénomFournis;
                       FormTarif    donnéesàTéléch_CB;
                       Object[]     formTarif;
        private static Object[]     formTarif_Libellés;
        private static byte         langue      = 0;
        private        BigDecimal[] consommParticul;
     
     
        NoeudàCaseàCocher  (Object[] data_TariefForm,
                            String gewest,
                            String naam_Aanbod,
                            FormTarif dataToDownload_CB,
                           )
        {   formTarif                = data_TariefForm;
            donnéesàTéléch_CB        = dataTeDownloaden_CB;
            ...
        }
     
     
        private ArrayList assocLibellésAuxDonnées(Object[] chaîneSource)
        {   byte nbreEléments = (byte) chaîneSource.length;
            ArrayList chaîneCible = new ArrayList(nbreEléments);
            Object descendant = null;
     
            for (int nbreBoucle = 0; nbreBoucle < nbreEléments; nbreBoucle++)
            {   Object élément = chaîneSource[nbreBoucle];
     
                if (élément instanceof String)
                {   switch (...)  //
                    { case 0:
                        switch (...)
                        { case 1:
                            dénomFournis = (String) élément;
                            break;
                          case 2:
                            switch (...)
                            { case 1:
                                moisDApplication = (String) élément;
                                break;
                              case 2:
                                ...
                                break;
                              default:
                            }
                            break;
                          case 3:
                            ...
                            break;
                          default:
                        }
                        break;
                      case 1:
                        switch (...)
                        { case 0:
                            switch (...)
                            { case 0:
                              ...
                            }
                            break;
                          ...
                        }
                        break;
                      default:
                    }
                    descendant = (String) élément;
                } else
                {   if (élément instanceof Boolean)
                    {   ...
                        descendant = (Boolean) élément;
                    } else
                    {   if (élément instanceof BigDecimal)
                        {   ...
                            descendant = (BigDecimal) élément;
                        } else
                        {   if (élément instanceof Object[])
                            {   
                                switch (...)
                                { case 0:
                                   { ...
                                        élément = ((Object[])formTarif[iCA[0][1]]);
                                        break;
                                      case 2:
                                        switch (...)
                                        { case 0:
                                            chaîneCible.add(((Object[])formTarif_Libellés[langue])[3]); // Always a String
                                            break;
                                          ...
                                          default:
                                        }
                                        break;
                                      ...
                                      default:
                                    }
                                    break;
                                  default:
                                }
                                descendant = (ArrayList)assocLibellésAuxDonnées((Object[]) élément);
                            } else
                            {   if (élément == null)
                                ...
                            }
                        }
                    }
                }
    /* Note: C:\Documents and Settings\Charles\Mijn documenten\Applic Program\Java\CostComp_HomeElectric_2\
     * src\arbreformtarifàtélécharger\Noeudà2CasesàCocher.java uses unchecked or unsafe operations.
     * Note: Recompile with -Xlint:unchecked for details.
     */
                chaîneCible.add(descendant);
            }
            return (chaîneCible);
        }
    A se rappeler:
    - 'élément' et 'descendant' sont, en fonction du cas, de type String, BigDecimal, Boolean, Object[] ou null.
    - 'assocLibellésAuxDonnées' est une fonction réentrante

    Si, conformément à la syntaxe
    arrayList.add(E e)
    dictée dans la Javadoc (http://java.sun.com/javase/6/docs/api/ ), je spécifie le type du paramètre, p.ex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaîneCible.add(String descendant)
    ou ailleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaîneCible.add(String ( (Object[])formTarif_Libellés[langue] )[3] ); // Always a String
    , alors le précompilateur rouspète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ')' expected
    ';' expected
    Not a statement
    Cannot find symbol
    Symbol : variable String
    location : ...
    Il semble que le compilateur commet une confusion : Il interprète 'String' comme étant une variable (non séparée par un ';' de la variable suivante, 'descendant'). Il semble ne pas connaître arrayList.add(E e)

    Si je ne mets pas le type 'String', c'est le débuggeur qui rouspète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* Note: C:\Documents and Settings\Charles\Mijn documenten\Applic Program\Java\CostComp_HomeElectric_2\
     * src\arbreformtarifàtélécharger\Noeudà2CasesàCocher.java uses unchecked or unsafe operations.
     * Note: Recompile with -Xlint:unchecked for details.
     */
    Merci d'essayer d'éclaircir.

  4. #4
    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
    les liste attedent des types bien précis, décidés lors de leur déclaration. Dans ton cas, l'arraylist contient des choses variées, ta seule solution est donc de déclarer ton arraylist comme étant une arraylist d'objets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        private ArrayList<Object> assocLibellésAuxDonnées(Object[] chaîneSource)
        {   byte nbreEléments = (byte) chaîneSource.length;
            ArrayList<Object> chaîneCible = new ArrayList<Object>(nbreEléments);

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut
    Cher Tchize,
    Dans le mille. Merci beaucoup pour ta réponse qui m'a débloqué.
    Je croyais qu'en déclarant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList chaîneCible = new ArrayList(nbreEléments);
    , soit sans '<Object>', cela revenait par défaut strictement au même qu'en déclarant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<Object> chaîneCible = new ArrayList<Object>(nbreEléments);
    .
    Eh bien non ...
    Dès lors, pas besoin de spécifier le type 'E' de l'objet 'e' à accrocher, comme argument à 'add'. J'avais mal interprété la Javadoc concernant ArraList.add(E e) .
    Tout marche fluide après cette ajoute. Sempiternel, mon remerciement.

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

Discussions similaires

  1. Methode add d'ArrayList
    Par davdoo91 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 28/02/2009, 16h50
  2. [add-in VS2008] Ajout d'un nouveau type de classe
    Par aurelien.tournier dans le forum Visual Studio
    Réponses: 5
    Dernier message: 22/05/2008, 18h00
  3. Spécification de type de fichier au moment de sauvgarde
    Par hamdani dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 08/06/2007, 14h19
  4. template spécification du type possible
    Par MatRem dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2007, 14h47
  5. Réponses: 4
    Dernier message: 20/05/2006, 21h41

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