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

  1. #21
    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
    En fait, je pense que tu as compris ma démarche, tu as d'ailleurs proposé le code de l'interface que j'ai posté au début (au nommage près).

    Par contre, dans ce que tu proposes, j'aimerais voir comment tu écris l'implémentation de la méthode getType dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MachinService extends Service<Machin<Long>> {
        public Class<Machin<Long>> getType() {
           ????
        }
    }

  2. #22
    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
    return Machin.class ?

  3. #23
    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
    Non, c'est bien là le problème, le compilateur ne l'accepte pas...

  4. #24
    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
    erf, et avec un typecasting forcé? +ignore warning? Dans ce cas ce sera ok pour la pluspart des classes sauf les classes génériques :/

  5. #25
    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
    Je peux m'en sortir, avec un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (Class<Machin<Long>>) ((Object) Machin.class))
    Mais cela n'a plus trop d'intérêt...

    Eventuellement, je pensais à change la méthode getType comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class<? super T> getType()
    Comme cela, je peux faire sauter les généric et renvoyer Machin.class, ce qui est acceptable de mon point de vue.

  6. #26
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Bonjour il y a quelque chose que je ne comprends pas : à quoi sert la méthode getType dans l'interface? Si elle est dans l'interface c'est qu'elle doit être utile au client mais je ne vois quand ce dernier devrait être amené à l'utiliser. Il serait intéressant de voir le code du client...

  7. #27
    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
    Je n'ai pas de code à montrer car l'exemple que j'ai montré est une grosse simplification de la réalité.

    Par contre, je peux expliquer le principe.
    C'est une architecture modulaire où les 'ServiceProvider's sont accessibles.
    Un client va les parcourir jusqu'à en trouver un qui propose un service du type recherché.
    Comme cela se passe à l'exécution, les types génériques ne servent plus à rien, d'où l'intérêt d'exposer le type du service.

  8. #28
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Je ne pense pas que ce soit au client de parcourir les ServiceProvider. Je pense qu'il n'y a qu'un seul provider, et que ce dernier permet de renvoyer au client le bon service en fonction d'un paramètre, qu'on peut choisir comme étant la classe du service recherché (ou plutôt la classe de son interface). Ce qui donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public interface Service<T> {
     void process(T arg);
    }
     
    public class ServiceProvider {
      Map<Class<?>,Service<?>> map = ..;
     
      public <T> Service<T> getService(Class<T> cls) {
      return (Service<T>) map.get(cls);
    } 
    }

  9. #29
    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
    Quand je dis que le client parcours les ServiceProvider, c'est une image, il y a une entité intermédiaire qui le fait pour lui.

    Ceci dit, l'exemple que tu donnes est trop rigide:
    - Il ne gère pas l'héritage (si je veux une Collection, une List conviendra aussi)
    - A une interface donnée peuvent exister plusieurs services

    Après, c'est mon choix que les plugins exposent des ServiceProvider, donc il y en aura plusieurs (à noter que je ne l'ai pas appelé ServicesProvider). Autre détail, l'interface est plus riche que ce que j'ai affiché. La mettre dans une Map revient à la réduire à un simple couple (Type, ServiceDeCeType) et à perdre le bénéfice des autres méthodes de l'interface.

    Mais bon, après tout, le but du post n'est pas de parler d'archi, d'autant plus que j'ai donné assez peu d'infos sur le sujet...

  10. #30
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Pour gérer l'héritage et le multiservices, c'est pas bien compliqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public <T> List<Service<? super T>> getServices(Class<T> cls) {
      List<Service<? super T>> list = new ArrayList<Service<? super T>>();
      while (cls != null) {
        Service<? super T> service = (Service<? super T>) map.get(cls);
        if (service != null) {
          list.add(service);
        }
        cls = cls.getSuperClass();
      }
      return list;
    }

  11. #31
    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
    dans l'ensemble, si ce n'est pas hyper important que le type de la classe retourné soit controlé par le compilateur, il reste l'option Class<?> dans la signature. Et je reconnais que certain forcage de type ne sont pas possibles proprement en generics :/

    Ceci dit, quand on regarde certaines classes de sun (jette un oeil à AbstractList) c'est pas les suppresswarning qui manquent

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/02/2013, 00h27
  2. ClassCastException dans une classe générique
    Par lion13 dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2008, 20h35
  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, 14h16
  4. Problème avec une classe générique
    Par Core8 dans le forum C++
    Réponses: 3
    Dernier message: 19/03/2007, 04h18
  5. Utilisation d'une classe générique
    Par bandit_debutant dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2006, 17h54

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