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 :

[Static] Problème d'utilisation


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut [Static] Problème d'utilisation
    Bonjour,

    je rencontre un petit probleme avec java
    notament avec les fonctions static et les generics
    voila ce que j'aimerais avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Plugs<T> {
     
    	public Plugs() {
    	}
     
    	public static <T> ArrayList<T> discover(String path) {
    		System.out.println("Discover dans plus<T>");
    		return null;
    	}
    }
    une classe qui permet par le biais de l'introspection de decouvrir toutes les classes implementant une type defini par T

    si la définition de la classe ci dessus passe a la compilation, pour l'utilisation .... ca passe pas ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<IBase> list =	Plugs<IBase>.discover("");
    me genere une erreur
    Multiple markers at this line
    - IBase cannot be resolved to a variable
    - The method discover(String) is undefined for the
    type Main
    - Syntax error on token ".", delete this token
    - Plugs cannot be resolved to a variable

    si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ArrayList<IBase> list0 = Plugs.discover("");
    ca passe mais je me demande alors comment il sait ce qu'est T ....

    si vous avez une idée
    pour info je viens du c# et j'aimerais faire une factory (donc plutot une classe static)
    avec evidement seulement des membres static

    merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par ikeas Voir le message
    si la définition de la classe ci dessus passe a la compilation, pour l'utilisation .... ca passe pas ....
    Comme le générique s'applique à la méthode et non à la classe, la syntaxe correcte est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<IBase> list =	Plugs.<IBase>discover("");
    Mais ce n'est pas nécessaire. La syntaxe ArrayList<IBase> list = Plugs.discover(""); est équivalente.

    Citation Envoyé par ikeas Voir le message
    ca passe mais je me demande alors comment il sait ce qu'est T ....
    Il ne sait pas. En Java les génériques n'existent qu'au compile-time, pas au runtime. Le compilateur sait que <T> est <IBase> parce que la méthode renvoie ArrayList<T> et que tu affectes le résultat à une ArrayList<IBase>. Pas compliqué d'inférer ce que tu veux que <T> représente.

    ... Mais la méthode sera incapable de rechercher quoi que ce soit basé sur ce paramètre générique, car ce paramètre n'existe pas au runtime. Il te faudrait quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static <T> ArrayList<T> discover(Class<T> type, String path)
    que tu peux appeler comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<IBase> list0 = Plugs.discover(IBase.class, "");
    Deux remarques :
    - Au départ Java ne propose pas de moyen clair de rechercher toutes les implémentations d'une classe ou interface. Il existe des bibliothèques tierces qui font cette recherche, mais tu en auras besoin.
    - Il serait plus élégant de manipuler des List plutôt que des ArrayList. ArrayList ce sera juste au moment de faire le new.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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


    Je rajouterais juste que dans le cas précis la classe Plugs n'a pas à être Generics.
    C'est seulement sa méthode static qui doit l'être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Plug {
    	public static <T> ArrayList<T> discover(String path) {
    		...
    	}
    }
    a++

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    merci je vais tenter cela

    j'ai un problème sous jacent c'est que j'ai besoin de récupérer le nom de mon T
    par exemple si j'ai Plug<IBase> je devrais avoir sample.interfaces.IBase

    je suppose qu'en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static <T> ArrayList<T> discover(Class<T> type, String path)
    ca devrait etre simple mais moins "sexy"

    y'a ti'il une possibilité pour reccuperer le nom dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<IBase> list =	Plugs.discover("");
    merci en tout cas pour les infos precendantes

  5. #5
    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
    Citation Envoyé par ikeas Voir le message
    y'a ti'il une possibilité pour reccuperer le nom dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<IBase> list =	Plugs.discover("");
    Non, il faut passer par un paramètre de type Class<T>.

    Et ce n'est pas forcément moins "sexy" que le bout de code de ton premier post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ArrayList<IBase> list =	Plugs.discover(IBase.class, "");
    // VS
    ArrayList<IBase> list =	Plugs<IBase>.discover("");

    a++

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    oui merci

    pour moi le coté sexy viens du fait que ça me semble plus simple en c# (voir meme en c++)

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

Discussions similaires

  1. [RTFEditorKit] Problème d'utilisation
    Par jean.lamy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 21/10/2004, 18h30
  2. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35
  3. [cvs] problèmes d'utilisation
    Par gromite dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/06/2004, 17h41
  4. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  5. problème d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 03/12/2003, 10h44

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