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 :

Utilisation de la généricité


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Par défaut Utilisation de la généricité
    Bonjour,
    Je souhaite créer un objet dont le type générique n'est connu qu'à l'execution (après la lecture d'un fichier par exemple). C'est dire à peu près cela (qui n'est pas valide) :

    Class<?> t = unobjet.getClass();
    MaClasse<?> c= new MaClasse<t>();

    Auriez-vous une idée ?
    Merci d'avance !

  2. #2
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Regarde plutot du cote de Class.forName() et de Class<T>.newInstance(). Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Class<?> klass = Class.forName("org.monpackage.MaClasse");
    MaClass aMoi = (MaClasse) klass.newInstance();
    Tu peux aussi faire monObjet.getClass().newInstance().

    Cela marche meme sans les generics.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Par défaut
    Mais si MaClasse est générique ? Dans ton code elle ne l'est pas. Et justement, c'est le paramètre de type de cette classe que j'obtiens via un fichier, lors de l'éxecution. Ainsi je souhaite instancier ce parametre avec le type lu, lors de la création d'un nouvel objet.

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

    Citation Envoyé par Ecureuil_man
    Ainsi je souhaite instancier ce parametre avec le type lu, lors de la création d'un nouvel objet.
    Justement tu ne peux pas ! La validité des type générique est effectué à la compilation. Donc si tu le fait de manière générique tu dois t'en passer (comme avant Java 5.0 en fait).

    Donc tu écrit tout simplement ton code sans précisié le type des Générics puisqu'il ne sera pas connu à la compilation, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List list = new ArrayList();
    Cela marche très bien mais cela t'affiche un warning... A la rigueur tu peux l'éviter en utilisant le type Object ou le type de base de ta classe Generics :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Object> list = new ArrayList<Object>();
    Enfin attention à ne pas confondre les Generics et la généricité...
    Les Generics ne sont qu'un moyen de sécuriser un peu plus les classes génériques, grâce à des vérifications du typage à la compilation...
    Mais on peut très bien faire des classes génériques sans les Generics (l'API de Collection est bien générique même avant Java 6.0).

    a++

  5. #5
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Attention, je peux me trompe mais

    les generics Java ne sont pas comme les templates C++..

    Les generics sont vérifie uniquement à la compilation...

    Autrement dit un

    List<String>
    List<Object>
    List<MaClasse>

    une fois compile, ca redevient un bete List sans type.

    Donc je ne pense pas qu'il y ai moyen de définir un type qu'utilise un generic durant l'execution.

    Mais encore une fois, je ne peux pas l'assurer
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  6. #6
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Exact, et ca s'appelle l'erasure.

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Par défaut
    Ok merci. Je vais donc ajouter un attribut de type Class à ma classe générique, et enlever le paramètre formel <E> qui, il est vrai, n'est pas approprié pour ce contexte.

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

Discussions similaires

  1. Comment utiliser la généricité en java ?
    Par Adorien dans le forum Langage
    Réponses: 3
    Dernier message: 27/04/2010, 12h35
  2. Réponses: 14
    Dernier message: 26/09/2006, 15h18
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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