Partage
  • Partager sur Facebook
  • Partager sur Twitter

Généricité en Java

méthodes génériques

    18 septembre 2016 à 22:23:23

    Salut à tous, :)

    Je viens d'aborder le chapitre sur la généricité en Java. Mais je n'arrive pas à comprendre les méthodes génériques, j'ai cherché partout mais aucun cours n'explique pourquoi on doit écrire: des fonctions du genre : 

    public <T> T nomFonction(Vehicle<T> v) {
        .....
    }

    A quoi correspond le <T> T devant le nom de la fonction,  normalement s'est censé être le type de retour, et par moment on retrouve aussi des fonctions du genre ;

    public static <T extends Classable> void tri(ListeGenerique<T> liste) {....}


    Là je suis encore plus perdu, sachant que le type de retour est void pourquoi y a-t-il un type avant ?

    Mais de bien avoir la gentillesse de m'expliquer à quoi cela correpond, car je suis vraiment perdu dans ce cours... :(

    Cordialement.

    -
    Edité par Killer-bee 19 septembre 2016 à 2:03:55

    • Partager sur Facebook
    • Partager sur Twitter

    UKnow

      18 septembre 2016 à 22:54:13

      Bonjour.

      Ce qui est précisé avant le type de retour c'est la liste des "arguments de type" (je ne sais pas si ça porte un nom précis), exactement comme ceux que l'on met après le nom d'une classe pour la rendre générique.

      Dans ton exemple :

      • <T> précise que la méthode est générique ;
      • T est le type de retour.
      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        18 septembre 2016 à 23:41:30

        Pinguet62 a écrit:

        Bonjour.

        Ce qui est précisé avant le type de retour c'est la liste des "arguments de type" (je ne sais pas si ça porte un nom précis), exactement comme ceux que l'on met après le nom d'une classe pour la rendre générique.

        Dans ton exemple :

        • <T> précise que la méthode est générique ;
        • T est le type de retour.

        Merci pour ta réponse, mais ça ne répond pas vraiment à ma question, T est le type de retour oui, mais pour une fonction void il n'est pas censé y avoir de retour dans pourquoi doit on y mettre un T ?
        • Partager sur Facebook
        • Partager sur Twitter

        UKnow

          19 septembre 2016 à 1:30:28

          Bonsoir,

          T est un type générique utilisé par la fonction. Ca peut être le type de retour ou un type utilisé dans les paramètres ou les deux.

          public <T> T uneMethode() {
              // ...
          }
          
          public <T> void uneAutreMethode(T unParametre) {
              // ...
          }
          
          public <T> void encoreUneAutreMethode(UneClasse<T> unParametre) {
              // ...
          }




          -
          Edité par brubru777 19 septembre 2016 à 1:39:07

          • Partager sur Facebook
          • Partager sur Twitter
            19 septembre 2016 à 2:16:35

            Donc, d'après Pinguet62 on met <T> pour dire qu'il s'agit d'une méthode générique (même si je ne comprends pas l'intérêt de le préciser :o ), ok jusque là, ensuite il y a ce 2ème T, que l'on place pour définir le type de retour comme dans toute fonction qui renvoie quelque chose.

            J'ai lu quelque part, il me semble que l'on pouvait créer des fonctions génériques dans des classes qui ne sont pas forcément générique. En prenant cette classe:

            public class Classe {
            
               public <T> T uneMethode() {
                   // ...
               }
            

            Comment le compilateur va connaître ce que représente ce T ? o_O

            Si on avait ça :

            public class Classe<T> {
            
               public <T> T uneMethode() {
                   // ...
               }
            
            }


            Là, le compilateur va pouvoir savoir ce qu'est ce T puisque l'on va le définir en créant un objet d'un type T, alors que dans le premier cas le type est inconnu.

            J'espère que vous comprendrez ce que je veux dire par là :-°

            -
            Edité par Killer-bee 19 septembre 2016 à 2:38:18

            • Partager sur Facebook
            • Partager sur Twitter

            UKnow

              19 septembre 2016 à 9:53:40

              Pourquoi préciser <T> avant la déclaration de la méthode ?

              Dis moi dans le code ci-dessous à quoi correspond le T dans List<T> : est-ce le générique ou est-ce le type de la classe déclarée juste au dessus ?

              class T { }
              
              class Foo {
                  void method(List<T> items) { }
              }

              Comment le compilateur va connaître ce que représente ce T ?

              C'est exactement comme pour la généricité sur une classe.

              • Partager sur Facebook
              • Partager sur Twitter
              Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                19 septembre 2016 à 10:59:52

                Pinguet62 a écrit:

                Pourquoi préciser <T> avant la déclaration de la méthode ?

                Dis moi dans le code ci-dessous à quoi correspond le T dans List<T> : est-ce le générique ou est-ce le type de la classe déclarée juste au dessus ?

                class T { }
                
                class Foo {
                    void method(List<T> items) { }
                }

                Comment le compilateur va connaître ce que représente ce T ?

                C'est exactement comme pour la généricité sur une classe.


                Je vois ce que tu essayes de me faire comprendre. Donc là, ça doit être le type de la classe. Le <T> devant la méthode permet de différencier une classe T d'un type générique c'est bien ça ?
                • Partager sur Facebook
                • Partager sur Twitter

                UKnow

                Généricité en Java

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown