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 :

[JAVA 5.0] Generics - Cast et creation d'objets


Sujet :

Langage Java

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 139
    Points
    139
    Par défaut [JAVA 5.0] Generics - Cast et creation d'objets
    Bonjour,

    J'ai une classe A definie de la facon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class A<P extends A>{
     
     public A(){}
     
     public P create(){
       ....
     }
     
    }
    Et je voudrais que le classe A me renvoie une nouvelle instance de type P.

    J'ai donc essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public P create(){
       return new P();
     }
    et ainsi que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public P create(String clazz){
       return (P) Class.forName(clazz);
     }
    Mais aucune des deux methodes ne marchent, est-il possible de faire cela avec les generics? Pourriez vous m'expliquer pourquoi je ne peux faire faire ce qui est fait au dessus?

    Merci

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Il n'y a pas d'autre choix que d'utiliser l'instrospection dans ton cas, mais bon explique-nous dans quel but tu veux faire ça (avec un exemple concret au lieu de A et P)

    EDIT: selon ta réponse, je pense que le pattern strategy pourra être adapté à ton problème

  3. #3
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Tu pourrais faire :

    (non testé non compilé mais c'est sûr ça marche)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class Toto<T>
    {
     T t;
     
     Toto(T t)
     {
      this.t = t;
     }
     
     T create() throws ...
     {
      return t.getClass().newInstance();
     }
    }
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  4. #4
    Membre confirmé
    Avatar de mhamedbj
    Profil pro
    Inscrit en
    Février 2007
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 403
    Points : 554
    Points
    554
    Par défaut
    c'est bien d'avoir évoqué ce partie que j'ai du mal a assimilé

    svp ci c'est possible de me dire a quoi sert exactement ce <T> et en quoi il est util ???

    juste un petit exemple avec la manière de l'utiliser je me perd dans le doc en anglais :
    une classe de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class maClasse <Integer, String>
    qu'est ce quelle a de plus que les autres.

    j'ai essayé de m'aventurer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Printer<T>
    {
      public void print(T t)
      {
        System.out.println(t);
      }
    }
    et quand je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Printer p = new Printer();
        p.print("mmm");
    il affiche tout simplement "mmm" aquoit bon le <T> alors ??,
    pour les générique de syle
    ça au mion c'est clair mais le génériques des classe franchement je me perd
    merci d'avence
    Si on tombe un jour... c'est pour mieux se relever !!
    Take a look

    Mon début de carrière

  5. #5
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Ah ! Comme ils disent, sur java.net : No So Stupid Question (il y en a d'ailleurs une sur les generics : (Not So) Stupid Questions 16: What's the Difference Between Wildcard Generics and no Generics?

    Les generics te permettent d'avoir plus de rigueur dans la déclaration des objets.... génériques.

    Par exemple (classique), quand tu définis une ArrayList, il est bien évident que tu peux y mettre n'importe quoi. Avec les génériques, tu peux déclarer que ce n'importe quoi sera, par exemple, des entiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ArrayList<Integer> liste;
     
    liste = new ArrayList<Integer>();
    // bon
    liste.add(new Integer(3));
    // pas bon, refusé à la compil.
    liste.add("toto");
    Les génériques n'ont pas de fonction lors de l'exécution. Cela explique ( ? ) que lorsque tu fais p.print("mmm") il ne se passe rien de particulier.

    A propos de class maClasse <Integer, String>, je ne suis pas sûr que cela veuille dire quelque chose. Il s'agit probablement d'une tentative d'usage de génériques dans le cadre d'un héritage.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par mhamedbj
    j'ai essayé de m'aventurer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Printer<T>
    {
      public void print(T t)
      {
        System.out.println(t);
      }
    }
    et quand je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Printer p = new Printer();
        p.print("mmm");
    il affiche tout simplement "mmm" aquoit bon le <T> alors ??
    C'est parce que tu as fait une classe générique Printer, mais lors de son utilisation tu n'utilises pas les generics, donc dans ce cas effectivement ça ne sert à rien.

    Si tu faisais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Printer<String> printer = new Printer();
    printer.print("mmm"); //fonctionne
    printer.print(5); //ne fonctionne pas
    ça permet de "forcer" l'utilisateur à utiliser le BON type lorsqu'il utilise les generics (comme pour les collections).

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


    Pour en revenir au problème initial :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public P create(){
       return new P();
     }
    Ceci ne peut pas marcher car le type de P est perdu à l'exécution. Il est donc impossible de créer de nouvelle instance...

    Plus d'info : Les Generics ne sont pas des Templates comme les autres !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public P create(String clazz){
       return (P) Class.forName(clazz);
     }
    Quand à Class.forName(), il ne renvoi pas une instance de P mais une instance de Class<P> (à condition bien sûr que clazz soit le nom du type P) il faut utiliser la méthode newInstance()...


    Le plus simple serait surement de manipuler directement un objet de type Class<P>. Je ne sais pas trop ce que tu veux faire exactement (ni la raison de cette relation entre A et P), mais je ferais quelque chose de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class A<P extends A> {
     
    	private final Class<P> type; 
     
    	public A(Class<P> type) {
    		if (type==null) {
    			throw new NullPointerException();
    		}
    		this.type = type;
    	}
     
    	public P create() {
    		try {
    			return this.type.newInstance();
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
     
    }
    a++

    PS : Evites d'utiliser une simple lettre comme A pour un type réel, mais utilise cela uniquement pour les types paramétré... même si je suppose que tu n'a fait cela que pour l'exemple

  8. #8
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Concernant "les types génériques sont perdus après la compilation", comment est-il possible que la classe Class puisse récupérer par introspection ces types?

  9. #9
    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 ®om
    Concernant "les types génériques sont perdus après la compilation", comment est-il possible que la classe Class puisse récupérer par introspection ces types?
    En fait il faut bien distinguer deux cas...

    Pour les classes/interfaces/méthodes purement paramétré, comme List<E> ou ArrayList<E>, tu ne pourras récupérer que le type déclaré de <E> (Object dans ce cas). Ainsi que tu utilises une ArrayList<String>, une ArrayList<Date> ou une ArrayList<Long> tu obtiendras le même résultat et c'est normal car pour ces trois instances getClass() renvoi la même chose...


    Pour les classes/interfaces/méthodes qui utilisent des types paramétré c'est différent, par exemple pour cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void method(List<String> list);
    On peut retrouver le type String facilement via Reflection...

    De même pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class String implements Comparable<String> ...
    On pourra retrouver par reflection le type paramétré de Comparable...



    Je ne sais pas si je suis clair

    a++

  10. #10
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Oui, c'était très clair, merci beaucoup

  11. #11
    Membre confirmé
    Avatar de mhamedbj
    Profil pro
    Inscrit en
    Février 2007
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 403
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par gifffftane
    Ah ! Comme ils disent, sur java.net : No So Stupid Question [URL]

    Les generics te permettent d'avoir plus de rigueur dans la déclaration des objets.... génériques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ArrayList<Integer> liste;
     
    liste = new ArrayList<Integer>();
    // bon
    liste.add(new Integer(3));
    // pas bon, refusé à la compil.
    liste.add("toto");
    A propos de class maClasse <Integer, String>, je ne suis pas sûr que cela veuille dire quelque chose. Il s'agit probablement d'une tentative d'usage de génériques dans le cadre d'un héritage.


    pour les ArrayList générique j'avais précisé que je n'avais pas de problème dans ce sens.... merci de ne pas avoir répondu a ma question stupide


    merci ®om pour ce petit éclaircissement, c'est gentil de ta part
    Si on tombe un jour... c'est pour mieux se relever !!
    Take a look

    Mon début de carrière

  12. #12
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Citation Envoyé par mhamedbj
    merci de ne pas avoir répondu a ma question stupide
    Pas si stupide, hein ; la traduction de Not So Stupid est Pas si stupide : c'est en ce sens que je voulais parler.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  13. #13
    Membre confirmé
    Avatar de mhamedbj
    Profil pro
    Inscrit en
    Février 2007
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 403
    Points : 554
    Points
    554
    Par défaut
    never mind merci quand même ..!!
    Si on tombe un jour... c'est pour mieux se relever !!
    Take a look

    Mon début de carrière

Discussions similaires

  1. [Java mail] probleme de cast
    Par ulquiorra dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 12/07/2010, 15h08
  2. probleme de creation d'objet cristal report
    Par sam_12_3 dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 03/04/2006, 13h58
  3. creation d'objet de classe a partir de string
    Par mencaglia dans le forum C++
    Réponses: 1
    Dernier message: 14/03/2006, 09h56
  4. [debutant] Creation d'objet au fur et a mesure
    Par jamesleouf dans le forum Débuter
    Réponses: 8
    Dernier message: 14/03/2006, 00h06
  5. Lancer des shell unix pour creation d'objet ORACLE
    Par sygale dans le forum Administration
    Réponses: 6
    Dernier message: 27/10/2004, 18h03

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