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 :

Récupérer une Class générique


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut Récupérer une Class générique
    Bonjour!

    J'ai une interface de ce goût là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public interface ServiceProvider<T> {
     
        T getService();
     
        Class<T> getServiceType();
    }
    où T représente l'interface exposée par le service.

    Dans le cas où T est aussi un type généric, ça coince.
    Par exemple, prenons T = List<Runnable>, mon implémentation ressemblerait à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Provider implements ServiceProvider<List<Runnable>> {
        ...
     
        public List<Runnable> getService()
        {
            return monService;
        }
     
        public Class<List<Runnable>> getServiceType()
        {
            return ???;
        }
    }
    Je n'arrive pas à trouver une syntaxe qui satisfasse le compilo.
    Est-ce possible?
    Dois-je modifier mon interface 'ServiceProvider'?

    Merci.

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public Class<List<Runnable>> getServiceType() {
    		return (Class<List<Runnable>>) monService.getClass();
    	}
    tu aura un warning, mais ca passe
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Merci pour la réponse, malheureusement, cela convient pas car je vais renvoyer la classe de l'implémentation (ArrayList ou LinkedList par exemple) alors que je souhaite renvoyer l'interface du service (List<Runnable>)

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    pour quel raison as tu besoin du type ?
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Lorsqu'une entité à besoin d'un certain type de service, elle va voir qui le propose via les providers.

    Si j'affiche la classe de l'implémentation, elle pourrait éventuellement trouver des interfaces implémentées pour d'autres raisons.
    De plus, d'un point de vue conceptuel, le service doit présenter l'interface et non l'implémentation.

  6. #6
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    Citation Envoyé par Deaf Voir le message
    Lorsqu'une entité à besoin d'un certain type de service, elle va voir qui le propose via les providers.

    Si j'affiche la classe de l'implémentation, elle pourrait éventuellement trouver des interfaces implémentées pour d'autres raisons.
    De plus, d'un point de vue conceptuel, le service doit présenter l'interface et non l'implémentation.
    Justement je m'attends plus à un fonctionnement approchant ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         public interface ServiceProvider {
     
               public <T> T getService( Class<T> classe );
         }
    C'est l'appelant qui passe au provider le type de service qu'il recherche.
    Je peu a ce stade écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     List<Toto> a =  monProvider.getService( List<Toto>.class );
    Et avoir une implémentation de mon service utlisant une ArrayList.
    De plus, je n'aime pas trop utiliser des collections "brut" pour representer une notion de service. C'est trop abstrait, la liste ne te donne pas d'indication sur ce que represente ton ensemble. Par exemple List<Client> ne te dit pas qu'il s'agit d'un service te donnant la liste des clients mauvais payeur !! l'interface de ton service est floue.

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    tes types de service seront fixe ? si oui, tu peux peut être définir un enum avec tous les types et utiliser ensuite cet enum.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/02/2013, 23h27
  2. ClassCastException dans une classe générique
    Par lion13 dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2008, 19h35
  3. [Reflexion] Comment récupérer une class via son chemin python
    Par anthyme dans le forum Général Python
    Réponses: 2
    Dernier message: 27/12/2007, 13h16
  4. Problème avec une classe générique
    Par Core8 dans le forum C++
    Réponses: 3
    Dernier message: 19/03/2007, 03h18
  5. Utilisation d'une classe générique
    Par bandit_debutant dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2006, 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