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 :

Annotation et générique


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut Annotation et générique
    Bonjour,

    J'aimerai bien creer une annotation ressemblant a ca :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface MonAnnotation
    {
       /** Classe d'implémentation de mon attribut */
       <T extends MonInterface> Class<T> value();
    }

    Le but serait d'injecter un attribut d'une classe en fournissant l'implémentation dans l'annotation.
    Je voudrais également restreindre la classe d'implémentation aux classes respectant une certaine interface.

    Dans mon exemple, le compilateur rale en me disant que les attributs d'une annotation ne peuvent être des généric (dommage...)
    Y a-t-il un autre moyen de faire ca ?

    Merci d'avance
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  2. #2
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    Pour faire général, les annotations fournissent un moyen de marquer des éléments java, mais ce marquage n'a aucune conséquence directe sur le code, l'exécution, ou autre.

    Les conséquences doivent être écrite via autre chose.

    Donc, tu n'as aucun moyen d'écrire un truc style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @renvoyer("ceType")
    Chose<@renvoyer> fonction() {...
    Tu peux écrire une sorte de pré ou post processeur qui te garantisse que le type de Chose soit ceType, si tu veux.

    De toutes façons j'ai quelque mal à comprendre :

    Citation Envoyé par Mobius Voir le message
    Le but serait d'injecter un attribut d'une classe en fournissant l'implémentation dans l'annotation.
    La place pour fournir un attribut d'une classe est dans les setter et getter statiques, me semble-t-il ? Pourquoi les fournir dans une annotation ?
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

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


    Tu as cette erreur car tu tentes de faire une méthode Generics ce qui n'est pas possible, car dans ce cas le type de T dépendra de l'utilisation de l'annotation, et non pas de sa déclaration dans le fichier...


    Tu n'as pas à utiliser un paramétrage, mais simplement un type de retour de la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface MonAnnotation
    {
       /** Classe d'implémentation de mon attribut */
       Class<MonInterface> value();
    }
    a++

  4. #4
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    @gifffftane: ce développement se fait dans le cadre du développement d'un framework où l'on nous impose quelques contraintes mais où l'on est force de proposition. J'essaye donc de trouver des solutions simple à l'utilisation avec un minimum de contrainte pour l'utilisateur final. Donc sur le principe, je suis d'accord avec toi mais j'essaye de trouver une solution innovante (et je dois bien avouer que je me fais plaisir en sortant des sentiers battus)

    Citation Envoyé par adiGuba Voir le message
    Tu n'as pas à utiliser un paramétrage, mais simplement un type de retour de la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface MonAnnotation
    {
       /** Classe d'implémentation de mon attribut */
       Class<MonInterface> value();
    }
    Merci adiGuba,
    J'avais bien pensé a cette solution mais j'ai une autre errreur lorsque j'utilise l'annotation :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       /** Exemple d'implémentation */
       public static class MaClasse implements MonInterface { }
     
       /** attribut injecté */
       @MonAnnotation(MaClass.class)
       private MonInterface obj;
    avec l'erreur suivante :
    Type mismatch: cannot convert from Class<Exemple.MaClasse> to Class<MonInterface>
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  5. #5
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    En fait ca marche bien en déclarant l'annotation comme suit :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface MonAnnotation
    {
       /** Classe d'implémentation de mon attribut */
       Class<? extends MonInterface> value();
    }

    je pensais également avoir essayé cette solution plus tot dans la journée et j'avais eut une erreur. A coire que je n'avais pas fait exactement cela...

    En tout cas, merci pour vos idée
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

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

Discussions similaires

  1. Algorithmes génériques pour affichage de primitives 2D.
    Par Selenite dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 02/01/2005, 20h20
  2. [Generics] Classe générique
    Par norkius dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 15h57
  3. classe date générique ?
    Par lili_bzh dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 07/09/2004, 10h59
  4. taille d'objet générique
    Par Heimdall dans le forum C
    Réponses: 7
    Dernier message: 01/07/2004, 18h00
  5. caractère générique utilisable dans strcmp
    Par barthelv dans le forum C
    Réponses: 9
    Dernier message: 01/08/2003, 16h54

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