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

Java Discussion :

Vérifier si 2 objets sont du même type


Sujet :

Java

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut Vérifier si 2 objets sont du même type
    Bonjour

    HashMap<String,Integer> c = new HashMap<String, Integer>();
    HashMap<String,Double> e = new HashMap<String, Double>();
    System.out.println(t.getClass().equals(c.getClass()));

    Voila je cherche un moyen de savoir si 2 objet sont de la meme classe, cette methode marche, mais ne permet pas de differencier le fait, quelle ne sont pas construite avec les meme types, ce qui est un probleme pour le programme que je fais (je convertis un code c# en java...)
    Donc y'a t-il un moyen de verifier si les 2 hashmap/Arraylist.... sont differente en prenant compte leur type ?

    Merci

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    En C# je ne sais pas mais en java cela peut être très compliqué si tu veux faire une méthode qui marche à tous les coups. Entres autres joyeusetées, il peut très bien y avoir des types génériques de types génériques.

    De toutes façons il devrait être possible de se débrouiller avec Class.getTypeParameters.

    Attention toutefois que les génériques C# et Java ne sont pas équivalents. Dans vos principes de traduction, peut être serez-vous amenés à trouver des formes qui expriment une meilleure fidélité à l'original qu'une simple générique C# générique java.

    Enfin, par rapport à ton code, l'égalité simple entre deux classes peut simplement se vérifier par classe1 == classe2, pas besoin de equals.

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    Deja merci pour ta

  4. #4
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    Deja merci pour ta reponse qui m'apporte des idée ^^

    Sinon comment faire:

    TypeVariable[] tv = HashMap.class.getTypeParameters();
    me retourne K et V
    Comment faire pour appliquer cette fonction a une hashmap créé auparavant ?

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Heu je me suis un peu planté, c'était juste pour voir si tu avais bien compris

    Pour ton cas je pense qu'il faut plutot passer par les Field et Method du paquetage java.lang.reflect, qui propose des méthodes similaires pour accéder aux types génériques déclarés. Si tes variables sont locales, il n'existe aucun moyen. Et pour les types exacts au runtime comme en C#, aucun moyen non plus.

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    En Java pour plusieurs raisons les types paramétrées sont perdus à l'exécution (lire : Les Generics ne sont pas des Templates comme les autres !).

    Donc pour une classe Generics la méthode getTypeParameters() retournera les type de base (donc ici K, V) avec leurs types de bases (Object dans ce cas).

    Il n'y a malheureusement aucun moyen de connaitre le paramétrage d'une classe generics, à moins que ce paramétrage ne soit forcé lors de l'héritage, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class StringIntMap extends HashMap<String,Integer> {
    }

    a++

    PS : Juste une question : pourquoi as-tu besoin de cela ?

  7. #7
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    Bonjour
    Je travaille sur un projet d'optimisation de code. Mais avant d'arriver a ce but, le projet doit etre convertit en java.
    Merci pour votre aide. J'ai envoyé un mail a la personne qui la developpé en c#, pour voir si au niveau de ces test il y a un risque que des elements avec des types générique different soit placée, en esperant que non...
    ^^

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    comme les type générique sont convertit à la compilation en cast, tu peux toujours jouer sur les classcastexception qui vont finir par se déclencher si tu mélange dans les génériques


    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HashMap<String,Double> test = ......;
    methode(test);
    .....
    public void methode(HashMap a){
    HashMap<String,String> maMap = (HashMap<String,String>) maMap;
    String s = maMap.get("blabla");
    }
    Déclenchera un classcastexception lors de l'assignement à s, à l'exécution.

    Note que, normalement, tu ne devrais jamais perdre dans ton code la généricité, c'est une aide à la compilation précieuse, le code que j'ai mis en haut est du très mauvais code

  9. #9
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Heu... j'ai peur que tchize_ soit optimiste... À ce que je comprends il s'agit d'une traduction d'un source C# et source java, donc une erreur d'analyse peut très bien provoquer une erreur de compilation du coté java...

    Pour moi, deux alternatives :
    - supprimer toute forme de générécité coté java et ne travailler que le coté classe brute.
    - trouver des expressions si générales de généricité qu'elles passent à tous les coups
    - concevoir des classes wraps qui emportent la classe du type en plus de la valeur, ce qui permet de se rapprocher du comportement c#.
    - se baser sur un equals qui se contrefiche de la généricité, en le basant juste sur les objets réellement contenus, comme tous les equals... après tout, un equals ne se base jamais sur la classe déclarée, qu'elle soit générique ou pas; mais seulement sur la valeur à l'exécution, niveau auquel la généricité est hors-sujet, que ce soit en c# ou en java.

    (tiens ça fait 4 ? )

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/03/2015, 10h53
  2. Récupérer objets d'un même type dans une classe
    Par Madfrix dans le forum Langage
    Réponses: 12
    Dernier message: 19/02/2008, 14h17
  3. 2 objets de même type dans une classe
    Par _R3nO_ dans le forum Hibernate
    Réponses: 2
    Dernier message: 28/02/2007, 17h12
  4. Réponses: 1
    Dernier message: 10/02/2007, 21h30

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