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 :

pb de Cast de tableau primitif selon un type d'objet [FAQ]


Sujet :

Collection et Stream Java

  1. #1
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut pb de Cast de tableau primitif selon un type d'objet
    Bonjour,

    J'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                   Class cls = tab1.getClass().getComponentType();
     
                   if (cls.isPrimitive()) {
                      if (((double[]) tab1).length == ((double[]) tab2).length) res = true;
                   }
    Pour le moment dans le cas ou mon tableau contient des type primitifs je ne traite que les double.

    il me faudrait traiter aussi les cas boolean, char, byte, etc...

    J'ai pensé à utiliser une méthode comme suit pour tester les type primitifs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       public static boolean isDoublePrimitive(Class cls) {
     
          boolean ret = false;
     
          if (cls.equals(double.class)) ret = true;
     
          return ret;
       }
    Comment voyez vous le traitement pour gérer tous les cas ?
    Dois je faire une méthode isTypePrimitive(Class cls) pour chaque type primitif et gérer les différents cas ?

    Ou existe t'il une manière plus simple de faire ce traitement ?

    Merci d'avance

  2. #2
    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,


    C'est quoi l'objectif final de tout cela ? Pourquoi as-tu besoin de déterminer le type primitif exact ?

    Sinon pour ta méthode, je verrais plus ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public static boolean isDoublePrimitive(Class cls) {
            return Double.TYPE == cls;
        }
    a++

  3. #3
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab1 instanceof double[]
    Ca ne marche pas ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  4. #4
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Citation Envoyé par adiGuba
    C'est quoi l'objectif final de tout cela ? Pourquoi as-tu besoin de déterminer le type primitif exact ?
    J'obtiens par reflexion les valeurs de retours de certaines méthodes. Et j'ai des valeur hétéroclites en retour ( ex : double[] , Toto[], float[][], etc...)

    Dans l'exemple suivant , si mon tab1 est un int[], j'aurai un pb de cast.
    Si je le cast en Object[] , j'ai un pb aussi.

    Class cls = tab1.getClass().getComponentType();

    if (cls.isPrimitive()) {
    if (((double[]) tab1).length == ((double[]) tab2).length) res = true;
    }

    Citation Envoyé par adiGuba
    Sinon pour ta méthode, je verrais plus ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public static boolean isDoublePrimitive(Class cls) {
            return Double.TYPE == cls;
        }
    a++
    Oui, c'est mieux, par contre je ne peux ni obtenir Int.TYPE et Char.TYPE , pourquoi donc ?

  5. #5
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Citation Envoyé par xavlours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab1 instanceof double[]
    Ca ne marche pas ?
    ça à l'air d'être pas mal, en tout cas le code suivant fonctionne :

    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
    public class test {
     
       public test() {
          super();
          // TODO Auto-generated constructor stub
       }
     
       public static void main(String[] args) {
     
          // double[][] varTab1 = new double[0][0];
          char[][] varTab1 = new char[0][0];
          test(varTab1);
     
       }
     
       public static void test(Object o) {
     
          if (o instanceof double[][][]) {
             System.out.println("aaaaaa");
     
          }
          else if (o instanceof char[][]) {
             System.out.println("bbbbbbb");
          }
          else if (o instanceof double[][]) {
             System.out.println("cccccccc");
          }
       }
    }
    Par contre j'ai souvenir qu'en PHP on peut , traiter dynamiquement les types, ex ( la syntaxe ne sera pas bonne, mais l'esprit est là ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String type = new String("double");
    $type[] = new $type[]
    Le code là me donnerait un tableau double[] , bien sûr ce n'est pas $ qu'il faut utiliser , mais en java n'existe t'il pas une syntaxe approchante ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 109
    Points : 122
    Points
    122
    Par défaut
    Dans ton exemple, tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.reflect.Array.getLength(tab1)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (double[]) tab1).length
    Citation Envoyé par xavlours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab1 instanceof double[]
    Ca ne marche pas ?
    Ca doit marcher, en effet.

  7. #7
    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 elitost
    Dans l'exemple suivant , si mon tab1 est un int[], j'aurai un pb de cast.
    Si je le cast en Object[] , j'ai un pb aussi.
    Ce qui est normal puisque un type primitif n'hérite pas d'Object (cf plus bas)...


    Citation Envoyé par elitost
    Oui, c'est mieux, par contre je ne peux ni obtenir Int.TYPE et Char.TYPE , pourquoi donc ?
    Parce que les classes wrappers correspondante s'appellent Integer et Character


    Sinon pour revenir à ton problème : les tableaux ont un héritage un peu particulier :
    • Ils "héritent" tous de Object comme n'importe quel classe (même les tableaux de type primitif).
    • Les tableaux d'objets héritent des tableaux d'objets de leurs types parents (ex. Integer[] hérite de Number[] qui hérite de Object[] qui hérite de Object)


    Enfin ce que je voulais savoir c'est ce que tu veux faire au final, et pas comment tu veux le faire...

    Si tu veux seulement récupérer la taille d'un tableau quelque soit son type (primitif ou pas), tu peux utiliser la classe Array et sa méthode getLenght(Object)...

    a++

  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
    Citation Envoyé par elitost
    Par contre j'ai souvenir qu'en PHP on peut , traiter dynamiquement les types, ex ( la syntaxe ne sera pas bonne, mais l'esprit est là ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String type = new String("double");
    $type[] = new $type[]
    Le code là me donnerait un tableau double[] , bien sûr ce n'est pas $ qu'il faut utiliser , mais en java n'existe t'il pas une syntaxe approchante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object array = Array.newInstance( Double.TYPE, taille );

    a++

    PS : Au fait double.class, int.class... marche aussi

  9. #9
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Super, et merci pour toutes ces réponses très intéressantes et qui répondent à mes problèmes.

    Pour quoi faire tout cela ? C'est dans le cadre d'une méthode pour comparer le contenue de 2 objets de même type. Je scan certaines méthodes ( les getXXX, les isXXX etc...) et je descends dans la hiérarchie des attributs ( d'ou ma question sur les tableaux puisques certains getXXX me retourne des tableaux )

    En fait je n'ai trouvé aucune méthode pour me donner la liste des différences de contenu pour 2 instances différentes d'une même Classe.

    Si vous avez, je suis toujours preneur, car de toute manière ma méthode ne peut pas gérer tous les cas ( effectivement, pour un attributs telephone par exemple , le développeur ne créera pas forcement une méthode getTelephone mais peut être une donneTelephone )

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

Discussions similaires

  1. [PowerShell] Trier selon les Types d'objets
    Par I'm_HERE dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 13/05/2011, 13h11
  2. Taille de tableau différent selon les browser
    Par sethnesta dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 22/05/2009, 14h50
  3. Conversion de tableau de byte en types primitifs
    Par soft0613 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 14/03/2008, 15h14
  4. Réponses: 5
    Dernier message: 02/04/2007, 17h49
  5. [PHP-JS] Remplir un tableau javascript selon un tableau php
    Par jerome38000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/01/2005, 14h02

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