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 :

Classe générique avec une Enum


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 126
    Points : 110
    Points
    110
    Par défaut Classe générique avec une Enum
    Bonjour,

    comment mettre une enum en paramètre d'une classe paramètrée (generic) ?
    Je souhaiterais disposer de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abstract class MaClasse <T, R extends Enum>
    Le soucis est que Enum est en effet définie comme une Enum <Enum <E>>,

    Bref je n'arrive pas à dire que je passe un deuxième paramètres qui sera une 'enum Quelquechose {}'.

    m'enlève tout warning, mais je trouve ça très bizarre... non ?

    Il s'agit en fait d'un pattern pour un moteur de recherche, je veux pouvoir créer une moteur de recherche de T en définissant une enum de paramètres servant à la recherche... restera plus alors qu'à réaliser l'implémentation du traitement de chaque critère, et tout le reste (reconnaissance d'une map de paramètres par rapport à l'enum R définissant les critères utilisables, construction de la liste des résultats, etc..) est déjà implémentée de manière générique.

    Avez-vous une idée ?

    Merci,

    Gal'

  2. #2
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 126
    Points : 110
    Points
    110
    Par défaut
    Ou sinon....

    j'aimerais que l'abstract class MaClasse possède une

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abstract enum criteria {}
    mais apparemment, on peut pas faire d'une enum une classe abstraite (ce que je peux comprendre).


    Gal'

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 126
    Points : 110
    Points
    110
    Par défaut
    Bon, j'ai trouvé la soluce dans le '?'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract class SearchEngine<T, W extends Enum<?>> {
    Mais finallement mon pb est ailleurs.. je comprends pas ce qu'est une 'enum'.

    Gal'

  4. #4
    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 Galevsky Voir le message
    Bon, j'ai trouvé la soluce dans le '?'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract class SearchEngine<T, W extends Enum<?>> {
    Pourquoi un "?" ? La première solution me semble bien mieux non ?

    Citation Envoyé par Galevsky Voir le message
    Mais finallement mon pb est ailleurs.. je comprends pas ce qu'est une 'enum'.
    Une enum est tout simplement une énumération de valeur fini...

    a++

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 126
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Une enum est tout simplement une énumération de valeur fini...
    Non c'est pas tout simple. C'est un type d'objet qui possède .values()

    Or je veux faire une classe générique, qui a entre autre pour paramètres une 'enum'. Il s'agit d'une classe abstraite qui fournit des implémentations génériques pour certaines choses, notamment en rapport de l'énumération qui permet de paramétrer la classe.

    Donc il me faut à un moment donné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public abstract class SearchEngine<T, W extends Enum<?>> {
     
     
    public void uneMethodeBidon() {
     ....
     int i =  W.values.lenght().
     ....
    }
    Pourquoi ? parce qu'il s'agit d'un moteur de recherche générique, qui doit être paramétré par une 'enum' de critères de recherche. Suivant l'ordinal() dans l'enum, j'ai un critère plus ou moins prioritaire, et rien qu'en fournissant les paramètres d'une URL, il me faut récupérer les paramètres de l'URL qui sont des critères (appartient à l'enum).

    Il faut aussi fournir une implémentation de la gestion de chaque critère... pour cela j'aimerais une implémentation d'une méthode qui fait un gros switch sur le critère, et fait le traitement qu'il faut. Donc une enum pour le switch, c'est top. Et puis une énumération correspond exactement à la bonne modélisation de ce que sont les critères de recherche pour un moteur.

    Donc si tu as une solution pour que je puisse ensuite utiliser mon W.values() sans erreur, je t'en serais très reconnaissant


    Gal'

  6. #6
    Membre éprouvé

    Inscrit en
    Janvier 2009
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 467
    Points : 1 253
    Points
    1 253
    Billets dans le blog
    2
    Par défaut
    (même longtemps après, Google envoie toujours vers cette page

    Le problème c'est que values() est une méthode statique qu'il faut invoquer...

    Le paramètre "enum" n'est pas passable en tant que tel. A la limite on pourra passer l'objet Class<T> où est "T extends Enum<T>". Par exemple: Color.class:

    la signature de la function:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private static <T extends Enum<T>> int countValuesInEnum(Class<T> c) {
        //TODO:
        return 0;
    }
    Je ne sais pas comment on execute "values" sur c.

    Sinon pour valueOf, c'est plus simple. La fonction est disponible sur Enum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private static <T extends Enum<T>> List<T> convertToEnum(String[] values, Class<T> c) {
    	List<T> result = new ArrayList<T>();
    	for (String name : values) {
    		try {
    			T operation = Enum.valueOf(c, name);
    			result.add(operation);
    		} catch (IllegalArgumentException e) {
    			System.err.println("Unknown value '"+ name+"' for '"+c.getName()+"'");
    		}
    	}
    	return result;
    }
    Avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public enum Vegetable {
    	CARROT,
    	LEEK,
    	POTATO
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public enum Color {
    	BLACK,
    	YELLOW,
    	RED,
    	GREEN
    }

Discussions similaires

  1. @DiscriminatorValue avec une Enum
    Par fabou3377 dans le forum JPA
    Réponses: 2
    Dernier message: 23/05/2010, 16h06
  2. Charger une dataTable avec une Enum
    Par zooffy dans le forum ASP.NET
    Réponses: 21
    Dernier message: 03/05/2010, 14h40
  3. Réponses: 2
    Dernier message: 18/09/2008, 10h49
  4. Réponses: 5
    Dernier message: 15/05/2008, 22h19
  5. ORDER BY avec une enum
    Par HA-MS dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/09/2007, 17h40

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