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 :

Problème avec une generic method


Sujet :

Langage Java

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Problème avec une generic method
    Salut!

    J'essaye de créer une fonction generic basique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static <T> T f(T a,T b){
            return a+b;
        }
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Integer a=new Integer(1);
    Integer b=new Integer(2);
    Integer c=f(a,b);
    et j'ai ce message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The operator + is undefined for the argument type(s) T, T
    N'est-ce pas justement le rôle des generic de déterminer le type à la compilation.
    Qu'ai-je oublié?

    Merci de votre aide.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  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 seriousme
    Salut!

    J'essaye de créer une fonction generic basique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static <T> T f(T a,T b){
            return a+b;
        }
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Integer a=new Integer(1);
    Integer b=new Integer(2);
    Integer c=f(a,b);
    et j'ai ce message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The operator + is undefined for the argument type(s) T, T
    N'est-ce pas justement le rôle des generic de déterminer le type à la compilation.
    Qu'ai-je oublié?

    Merci de votre aide.
    Bah non, quelque soit le type, de toute façon, même si c'est Integer, tu ne peux pas faire "+"...
    Là ta généricité te permet simplement d'indiquer que le type de a doit être le même que le type de b, mais en aucun cas de faire un "+"

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Alors comment faire pour créer une fonction qui additionne 2 objets d'un type quelquonque, en supposant bien sûr que l'opérateur "+" est défini pour ces objets?
    Déjà comment faire avec des types primitifs:int, float ...?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Il faut pour cela, que ta classe T étende une classe permettant l'addition via l'opération +

  5. #5
    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 wichtounet
    Il faut pour cela, que ta classe T étende une classe permettant l'addition via l'opération +
    Aucune ne le fait (bon, à part en autounboxing, mais c limité)

  6. #6
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    peut etre avec java.lang.Number...

    mais si tu veux juste t entrainer a faire des methodes generiques teste avec des methodes hérité de object genre equals() ou un truc du genre


  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    C'est trés limité les "generic" Java ou c'est une impression?
    Est-il possible de faire l'équivalent de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <typename T>
    T add(T a,T b){
            return a+b;
            }
    ...
    int a=add(1,2);
    float b=add(1.0,2.0);
    string s1="abc",s2="cde";
    string s3=add(s1,s2);
    ?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  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
    Citation Envoyé par seriousme
    C'est trés limité les "generic" Java ou c'est une impression?
    Est-il possible de faire l'équivalent de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <typename T>
    T add(T a,T b){
            return a+b;
            }
    ...
    int a=add(1,2);
    float b=add(1.0,2.0);
    string s1="abc",s2="cde";
    string s3=add(s1,s2);
    ?
    Toi, tu viens du monde C++, non?

    Tu ne penses pas java

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Tu ne penses pas java
    Pas encore mais ça vient.
    Alors impossible à faire?
    Ca me paraitrait étrange que ce soit le cas.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

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

    Citation Envoyé par seriousme
    C'est trés limité les "generic" Java ou c'est une impression?
    Est-il possible de faire l'équivalent de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <typename T>
    T add(T a,T b){
            return a+b;
            }
    ...
    int a=add(1,2);
    float b=add(1.0,2.0);
    string s1="abc",s2="cde";
    string s3=add(s1,s2);
    ?
    Pourquoi chercher midi à 14 h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int a = 1 + 2;
    float b = 1.0 + 2.0;
    string s3 = "abc" + "cde";

    Citation Envoyé par ®om
    Toi, tu viens du monde C++, non?

    Tu ne penses pas java
    +1

    L'opérateur + n'a aucun sens sur des objets... Déjà avec les String c'est limite (et ce n'est d'ailleur qu'une ecriture simplifié qui est remplacé par le compilateur par un appel de méthode).

    Comme Java est un langage objet, tu dois utiliser des méthodes...

    a++

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Pourquoi chercher midi à 14 h :
    Ce n'est qu'un exemple basique.
    Ma question est:
    Comment créer une méthode qui effectuerait une opération "+" sur n'importe quel type qui définit l'opérateur "+"?
    D'ailleurs est il possible de redéfinir les opérateurs en Java?

    Comme Java est un langage objet, tu dois utiliser des méthodes...
    Là en fait je voudrait une méthode utilisable par plein d'objet sans la redéfinir pour chaque objet.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  12. #12
    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 seriousme
    Ce n'est qu'un exemple basique.
    Ma question est:
    Comment créer une méthode qui effectuerait une opération "+" sur n'importe quel type qui définit l'opérateur "+"?
    D'ailleurs est il possible de redéfinir les opérateurs en Java?


    Là en fait je voudrait une méthode utilisable par plein d'objet sans la redéfinir pour chaque objet.
    L'opérateur n'est pas redéfinissable.
    Si tu veux faire par exemple une méthode .m() sur plusieurs objets, tu peux faire une classe (abstraite de préférence, si son utilité n'est qu'une abstraction) qui donne le code de la méthode .add(). Ensuite, tes classes pour lesquelles tu veux utiliser ce .add(), tu les fais hériter de ta classe abstraite...
    Comme tu sais, l'héritage multiple n'est pas possible en java, mais si ton appli est bien conçue, ça n'est génant que dans des cas extrêmement particuliers (même si ça serait bien pratique de l'avoir l'héritage multiple).

  13. #13
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Oui mais l'héritage n'est pas pratique:
    -car il oblige a avoir une classe qui contiendra plein de méthode dont ne se serviront pas forcément toutes les classes filles.
    -mais en même temps cette classe doit être complète car pas d'héritage multiple.
    -on est obligé de définir les méthodes pour chaque classe fille, c'est pour éviter ce dernier point que définir une méthode unique pour effectuer des opérations sur des types différents m'interresserait, cela permettrait de factoriser le code.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  14. #14
    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 seriousme
    -car il oblige a avoir une classe qui contiendra plein de méthode dont ne se serviront pas forcément toutes les classes filles.
    -mais en même temps cette classe doit être complète car pas d'héritage multiple.
    Tu peux utilsier une interface...
    Et si la classe parente contient plein de méthode "inutile" aux classes filles c'est qu'il doit y avoir un problème dans ton héritage...
    Citation Envoyé par seriousme
    -on est obligé de définir les méthodes pour chaque classe fille, c'est pour éviter ce dernier point que définir une méthode unique pour effectuer des opérations sur des types différents m'interresserait, cela permettrait de factoriser le code.
    Si tu expliquais ce que tu veux faire exactement (avec tes méthodes, tes classes et tes données), on comprendrait peut-être mieux le problème qu'avec des exemples avec '+' qui est un cas particulier...

    a++

  15. #15
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Si tu expliquais ce que tu veux faire exactement (avec tes méthodes, tes classes et tes données), on comprendrait peut-être mieux le problème qu'avec des exemples avec '+' qui est un cas particulier...
    A vrai dire je n'ai aucune idée particulière.
    Je voulais juste savoir comment implémenter des fonctions équivalentes aux fonctions templates du C++, pour factoriser des méthodes en particulier ou faire des choses comme de la métaprogrammation.
    Tu ne penses pas java
    Je crois que c'est là mon problème, à vouloir copier-coller des concepts C++ en Java.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  16. #16
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Bon je vais plutôt bien étudier les "generic" et voir ce que l'on peut et ne peut pas faire avec.

    Merci encore pour votre aide.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

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

Discussions similaires

  1. problème avec une methode d'une classe
    Par membreComplexe12 dans le forum C++
    Réponses: 2
    Dernier message: 13/01/2011, 09h21
  2. Réponses: 8
    Dernier message: 12/01/2011, 19h00
  3. Problème avec une instruction OUTER /Postgres
    Par Volcomix dans le forum Langage SQL
    Réponses: 14
    Dernier message: 21/04/2004, 16h56
  4. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29
  5. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 15h33

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