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 :

Variables génériques en Java ?


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 73
    Points
    73
    Par défaut Variables génériques en Java ?
    J'aurais voulu savoir si on peut utiliser des variables génériques en Java. Je m'explique :
    on peut créer des classes génériques comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class MaClasse<T extends Component> {
        // mon code
    }
    Peut on faire pareil avec des variables. Par exemple utiliser une fonction qui prendrait en paramètre n'importe quel composant qui hérite de Object.

    En fait je souhaite créer une interface utilisable par plusieurs classe et implémentant entre autre cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DragDropFixture<T> drag(Object obj);
    Le problème est que si je mets un TreePath en paramètre, ca ne marche pas (même si TreePath implémente Object).

    Suis-je assez clair ???

  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
    Citation Envoyé par barbiche
    Suis-je assez clair ???
    Non.

    (désolé je n'ai pas compris ce que tu voulais faire)

  3. #3
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    tu as une error dans ta syntax:
    method generics:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public <T extends Object> TypeDeRetour taFonction(T obj ){
            //ton traitement
           return TypeDeRetour;
    }
    n'oublie pas le extends Object,
    Regarde la doc sur les generics.

    Cheers,

  4. #4
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut génériques en Java
    regardes la doc de Sun: http://java.sun.com/docs/books/tutor.../generics.html

    Sinon, pourquoi ne pas déclarer ta classe comme ça:

    public class MaClasse<T> au lieu de

    public class MaClasse<T extends Component> { // mon code }

    et tu pourrais créer n'importe quel type en faisant par ex.:

    MClasse <JPanel> maPanel = new MaClasse<JPanel>();

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 73
    Points
    73
    Par défaut
    bon, alors ...
    J'ai une interface qui implémente les actions de Drag & Drop.
    Je souhaite implémenter cette interface dans plusieurs classes (les classes en questions hériteront de JTree, JTable, JList, etc.)
    Donc en implémentant cette interface dans une de ces classe (par exemple JTree) je me retrouve avec ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public JTree drag(Object obj) {
    Jusque là je pense que c'est clair

    Pour améliorer le code il faudrait que j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public JTree drag(TreePath pat) {
    Je me disais que puisque TreePath étend de java.lang.Object il n'y aurait pas de problème !!! Sauf que maintenant j'ai un message d'erreur me disant qu'il faut que j'implémente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public JTree drag(Object obj) {
    Donc je cherche un moyen de redéfinir Object à la volée ...

    Suis-je toujours aussi confus dans mes explications ?

  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 jhaythem
    tu as une error dans ta syntax:
    method generics:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public <T extends Object> TypeDeRetour taFonction(T obj ){
            //ton traitement
           return TypeDeRetour;
    }
    n'oublie pas le extends Object,
    Regarde la doc sur les generics.

    Cheers,
    Ou plutôt, oublie le "extends Object", il ne sert à rien (tout objet étend Object, c'est implicite)

  7. #7
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    j ai pas bien compris, mais bon, une solution facile
    tu implemente ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    JTree drag(object obj) {
         if( obj instanceof TreePath){
              // tu fais ton truc
         }
    }
    non?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 73
    Points
    73
    Par défaut
    mais je suis tout a fait d'accord.
    C'est justement pour ça que je ne comprend pas d'où vient le soucis.Le paramètre : drag(Object obj) devrait pouvoir être modifiable en drag(TreePath path), non ??

    Et surtout ca m'ennuie de laisser Object comme paramètre.

  9. #9
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    Citation Envoyé par ®om
    Ou plutôt, oublie le "extends Object", il ne sert à rien (tout objet étend Object, c'est implicite)
    Ouai tu as raison dans ce cas, mais parfois les generics sont confusing:
    genre dans un cas ou tu as un method
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void method(List<Animal> animal){
     
    }
    tu ne pourras pas faire l appel
    method(listedog) sachant que List<Dog> listDog = new ArrayList<Dog>();
    et que Dog extends Animal.
    donc il faut faire ? extends Animal...
    mais bon ce Thread n est pas dans ce sujet,
    Je m excuse pour le post precedent j etais confus, ahh les generics..

  10. #10
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    Citation Envoyé par barbiche
    mais je suis tout a fait d'accord.
    C'est justement pour ça que je ne comprend pas d'où vient le soucis.Le paramètre : drag(Object obj) devrait pouvoir être modifiable en drag(TreePath path), non ??

    Et surtout ca m'ennuie de laisser Object comme paramètre.
    en fesant drag(TreePath path) tu n es pas entrain de faire du overriding de ton interface mais tu es entrain de faire du overloading donc techniquement il te reste la method drag(Object path) a implementer.

    Non?

  11. #11
    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 barbiche
    C'est justement pour ça que je ne comprend pas d'où vient le soucis.Le paramètre : drag(Object obj) devrait pouvoir être modifiable en drag(TreePath path), non ??
    Non, ça n'est pas pareil.

    Imagine t'as une interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    interface I {
        void method(Object o) { ... }
    }
    et tu fais une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class C implements I {
        void method(String s) { ... }
    }
    Si la méthode définie dans C était la même que celle de I, il y aurait une grosse faille. Regarde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C c = new C();
    I i = c;
    i.method(new Integer(5));
    (j'ai mis le new Integer pour bien voir que c'est un entier et pas un String)

    Les développeurs de java ont d'ailleurs fait cette erreur sur les tableaux. Effectivement, un String[] est un Object[].
    On peut donc le casser facilement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String[] sTab = new String[1];
    Object[] oTab = sTab;
    oTab[0] = new Integer(5);
    Ce code provoque une RuntimeException à l'exécution, mais ça n'est pas vérifié à la compilation (il paraît que sur les toutes premières JVM, cela provoquait un segfault).

    Ils n'ont pas fait la même erreur avec les generics, ainsi une List<String> n'est pas une List<Object>...

  12. #12
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    quand tu appel ta methode JTree drag() tu lui passe un Object ou un TreePath?

Discussions similaires

  1. nom de variable dynamique en java
    Par monpseudonom dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 31/03/2008, 13h28
  2. Variable dynamique et Java
    Par Naeco dans le forum Langage
    Réponses: 4
    Dernier message: 06/04/2007, 11h14
  3. [ Variable environnement ] Version java
    Par lhpp dans le forum Général Java
    Réponses: 13
    Dernier message: 08/04/2006, 11h01
  4. [Applet] Comment envoyer une variable php au java?
    Par abstractor77 dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 09/03/2006, 10h18
  5. variable gloable en Java
    Par apan dans le forum Langage
    Réponses: 28
    Dernier message: 03/03/2006, 20h47

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