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 :

[Generics] getClass manière generique?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut [Generics] getClass manière generique?
    Bonjour,

    j'ai une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class MaClasse<T> {
     
     
    }
    Dans celle ci j'aimerai avoir une méthode qui prends un paramètre de type Object et qui renverrai true si l'object passé est du type <T>

    J'aurai aimer qque chose du genre

    "T.class" ou "obj instance of" mais cela n'est pas permis.

    Est-ce qu'il existe un autre moyen ? Merci d'avance
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

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


    Ce n'est pas permis car à l'exécution le type T est "perdu"...
    La meilleure solution serait d'obliger l'utilisateur à passer le type réel lors de l'utilisation de l'objet, par exemple dans le paramètre de la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MaClasse<T> {
     
        private final Class<T> type;
     
        MaClasse(Class<T> type) {
            this.type = type;
        }
     
        public boolean isInstance(Object o) {
            return this.type.isInstance(o);
        }
    }
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            MaClasse<Number> classe = new MaClasse<Number>(Number.class);
     
            System.out.println( classe.isInstance("hello") );        // false
            System.out.println( classe.isInstance(new Integer(0)) );// true
    a++

  3. #3
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Ok

    Merci pour ta réponse, qui malheureusement n'a fait que confirmer un doute que j'avais.

    Je retiens ton explication pour une prochaine fois, ici je ne vois pas trop comment faire dans mon cas précis.

    Je programme avec Spring MVC et avec des Validateurs de Spring.

    Ceux ci possèdent 2 méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface Validator {
        boolean supports(java.lang.Class aClass);
     
        void validate(java.lang.Object object, org.springframework.validation.Errors errors);
    }
    Mon but était de faire une AbstractGenericValidator<T> qui ferait qque chose comme ceci :

    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
     
    public abstract AbstractGenericValidator<T> {
     
    // T est le CommandObject 
     
        boolean supports(java.lang.Class aClass) {
     
    //           return  T.class.equals(aClass);
    }
     
       void validate(java.lang.Object object, org.springframework.validation.Errors errors) {
     
         T command = (T) object
     
         validateCommand(T, errors );
    }
     
     public abstract void validateCommand(T, org.springframework.validation.Errors errors);
     
        }
    Et ce afin de pouvoir faire rapidement des Validateurs en etendant cette classe comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public MetierValidator extends AbstractGenericValidator<MetierCommand> {
     
    public abstract void validateCommand(T, org.springframework.validation.Errors errors){
     
    //regle de validation
     
    }

    Mais dans ce cas présent, vu que ce n'est pas dans du code personnel mais spring qui instancie le validateur je suis bloqué

    Merci quand meme
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  4. #4
    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
    Il suffit de spécifier explicitement le constructeur vide dans les classes filles, qui fait appel au constructeur parent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MetierValidator extends AbstractGenericValidator<MetierCommand> {
     
        public MetierValidator() {
            super(MetierCommand.class);
        }
     
        // ...
    }
    Ca devrait être bon...

    a++

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

Discussions similaires

  1. [Generics] Surcharges de fonctions avec generiques
    Par zax-tfh dans le forum Framework .NET
    Réponses: 3
    Dernier message: 03/07/2013, 11h12
  2. [Débutant][C#] Compression de dossier de manière récurssive
    Par LordProgz dans le forum Windows Forms
    Réponses: 10
    Dernier message: 12/01/2010, 13h55
  3. [débutant][Conception] Modélisation pour éviter le getClass()
    Par Oliveuh dans le forum Général Java
    Réponses: 9
    Dernier message: 28/06/2004, 20h00
  4. Problème avec GetClass
    Par JerryMouse dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/10/2003, 19h03
  5. Documentation sur la manière de travailler avec le XML en java
    Par DelPiero62 dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 26/03/2003, 09h16

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