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 :

[Débutant] Génériques et types primitifs


Sujet :

Langage Java

  1. #1
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut [Débutant] Génériques et types primitifs
    Salut,
    j'ai un petit souci. Pour éviter des casts je voudrais typer une ArrayList de int pour ensuite la convertir en tableau de int mais mon code ne fonctonne pas (unexpected type) :

    List<int> rows = new ArrayList<int>(2); // unexpected type
    rows.add(125);
    rows.add(28);
    functionQuiPrendUnTableauDeInt(rows.toArray());
    Merci d'avance pour votre aide.

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Salut,

    Il faut utiliser Integer pour profiter de "l'auto-boxing"

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Integer> rows = new ArrayList<Integer>(2);
    A+

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    l'auto-boxing n'a rien à voir avec les générics.
    S'il faut utiliser Integer au lieu de int c'est parce qu'un int n'est pas un objet (ceci est valable pour tous les primitifs).

    L'autoboxing permet d'affecter directement un int à un Integer.

  4. #4
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Je sais bien le y@m's. Les generics utilisent des objets ( d'ou le message d'erreur ) donc la réponse à son problème est de remplacer la ligne telle que je lui ai montré et d'utiliser des Integer car les types primitifs ne fonctionneront pas.

    Ma remarque sur l'auto-boxing est qu'il peut continuer à manipuler son ArrayList comme un ArrayList de int, même si en interne ce sont des Integer

    A+

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    En fait je ne trouvais pas ton premier post très clair, c'était surtout pour éviter une confusion entre les deux concepts .

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Merci pour vos réponses. Par contre je n'arrive pas toujours pas à convertir la liste en tableau de int, aucune de ces méthodes ne fonctionnent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    jTree.setSelectionRows(rows.toArray());
    jTree.setSelectionRows(rows.toArray(new int[rows.size()]));
    jTree.setSelectionRows(rows.toArray(new Integer[rows.size()]));
    J'ai regardé Collection.toArray() mais je ne comprends pas très bien le principe :/.

  7. #7
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par Djakisback
    Par contre je n'arrive pas toujours pas à convertir la liste en tableau de int
    Je ne vois que ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public final static int[] listToInts(List<? extends Number> list) {
            int[] array = new int[list.size()];
            Iterator elements = list.iterator();
            int i = 0;
            while (elements.hasNext()) {
                array[i++] = elements.next().intValue(); // as Number
            }
            return array;
        }

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Il faut caster le type de retour (c'est Object[] par défaut) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jTree.setSelectionRows((Integer[])rows.toArray(new Integer[rows.size()]));
    enfin tu n'est pas obligé de spécifier la taille, un autre tableau sera alloué dynamiquement (c'est préférable si tu travailles sur de gros tableau en environnement multithréadé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jTree.setSelectionRows((Integer[])rows.toArray(new Integer[0]));
    a++

  9. #9
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    C'est le but premier de toArray() de toute collection (ArrayList & cie)
    http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html#toArray()

    Grosso modo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ArrayList<String> l = new ArrayList<String>();
    ....
    String[] tab = l.toArray();
    Dans tab tu auras tous les éléments de ton ArrayList

    [edit] Grillé

  10. #10
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Citation Envoyé par adiGuba
    Salut,

    Il faut caster le type de retour (c'est Object[] par défaut) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jTree.setSelectionRows((Integer[])rows.toArray(new Integer[rows.size()]));
    la methode toArray() retourne un Object[] mais dans ce cas il s'agit de la methode : <T> T[] toArray(T[] a)
    ce qui, dans son cas, renvoie un Integer[] (donc pas besoin de recaster).
    Apparament son problème est qu'il veut un int[] (à ce propos, peut-on caster un Integer[] en int[] ? ).

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par le y@m's
    la methode toArray() retourne un Object[] mais dans ce cas il s'agit de la methode : <T> T[] toArray(T[] a)
    ce qui, dans son cas, renvoie un Integer[] (donc pas besoin de recaster).
    Oups j'ai encore répondu trop vite

    Citation Envoyé par le y@m's
    Apparament son problème est qu'il veut un int[] (à ce propos, peut-on caster un Integer[] en int[] ? ).
    Heu... je ne pense pas...
    Dans ce cas la solution de g_rare est la plus simple...

    a++

  12. #12
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Ok, je me retrouve donc avec ce que j'avais fait au début et de typer la liste ne sert finalement à rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    List rows = new ArrayList();
    rows.add(2547);
    rows.add(15); 
    // Conversion de la liste en tableau de int
    int[] rows2 = new int[rows.size()];
    for (int i = 0; i < rows.size(); i++) {
    rows2[i] = ((Integer)rows.get(i)).intValue();
    }
    jtree.setSelectionRows(rows2);
    Merci pour tout et a+

  13. #13
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Question toute bête : pourquoi une List dans ce cas, si la seule utilité de celle-ci est d'avoir un tableau au final ? Est-ce à cause de la taille dynamique ? Si oui, tu pourrais crée un tableau suffisament grand dès le départ non ?

    A+

  14. #14
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Djakisback
    Ok, je me retrouve donc avec ce que j'avais fait au début et de typer la liste ne sert finalement à rien.
    Si.

    Cela sert à éviter des erreurs du style :

    a++

  15. #15
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    KiLVaiDeN: oui c'est pour la taille dynamique et je ne connais pas le nombre d'éléments à mettre dedans à l'initialisation.

    adiGuba: Ah oui, en effet ^^

  16. #16
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    avoir un tableau au final ? Est-ce à cause de la taille dynamique ? Si oui, tu pourrais crée un tableau suffisament grand dès le départ non ?
    Je me permet de poser une question:
    en Java peut on dire que les tableaux du type "int t[]" sont pseudo-dynamique par le fait que leur taille n'est pas necessairement fixée à la compilation, type VLA, ("dynamique") mais que en revanche il est impossible de la changer par la suite ("statique")?

  17. #17
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par seriousme
    Je me permet de poser une question:
    en Java peut on dire que les tableaux du type "int t[]" sont pseudo-dynamique par le fait que leur taille n'est pas necessairement fixée à la compilation, type VLA, ("dynamique") mais que en revanche il est impossible de la changer par la suite ("statique")?
    Salut,

    Un tableau déclaré int []t n'a pas de taille, on ne peut donc pas dire qu'il est pseudo dynamique. Certes sa taille n'est aps fixée à la compilation, mais dis toi bien que si tu ne fixe pas sa taille, tu ne peux pas l'utiliser.
    Lorsqu'on fait int[] t, on définit juste t comme un tableau d'int, sans pour autant lui dire qu'il fera telle ou telle taille.
    Java attend donc de savoir la taille finale (qui sera définitive) pour allouer la mémoire nécessaire à ce tableau. Un tableau dynamique est un tableau dont la taille n'est pas fixée, en premier exemple on a ArrayList, dont la taille se redimensionne automatiquement...

    Mais déclarer dans ton code int []t sans pour autant l'utiliser ne fait pas de t un tableau pseudo dynamique ^^

    mavina

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/12/2005, 16h54
  2. [Débutant] Changer le type d'une colonne
    Par david71 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 08/11/2005, 11h26
  3. [info] passer d'un type primitif a String
    Par soad dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2005, 13h19
  4. [Débutant] The authentication type 5, java
    Par agougeon dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 07/05/2005, 14h01
  5. [prog dynamique]Constructeur avec type primitif
    Par -=Spoon=- dans le forum Langage
    Réponses: 2
    Dernier message: 16/12/2004, 10h33

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