Partage
  • Partager sur Facebook
  • Partager sur Twitter

passer une arraylist generique en argument

    7 avril 2021 à 9:40:29

    bonjour

    j'ai une méthode qui prend en parametre une arraylist :

    public void methode(ArrayList<Objet1> objet, ...)

    puis dans la methode je fait appel a objet.getId()

    mais j'aimerais pouvoir passer aussi à cette fonction des objet de la classe Objet2 qui contient d'autres methodes met la methode commune getId()

    Donc je veux pouvoir faire :

    Objet1 objet1 = ...
    Objet2 objet2 = ...
    methode(objet1, ...)
    methode(objet2, ...)
    • Partager sur Facebook
    • Partager sur Twitter
      7 avril 2021 à 13:23:18

      Tu ne pourras pas à cause du type erasure des generics, parce qu'une fois compilé, methode n'aura comme signature que public void methode(Arraylist,...) et que 2 fonctions ne peuvent avoir la même signature.

      Il faut soit employer une fonction différente, soit utiliser un type plutôt que des generics.

      • Partager sur Facebook
      • Partager sur Twitter
        7 avril 2021 à 14:57:50

        Bonjour,

        Si tu as besoin de la méthode getId des objets dans ta méthode, une solution est de créer une interface avec la méthode getId et d'ajouter cette interface à tes classes Object1 et Object2.

        public interface Identifiable {
            int getId();
        }
        public class Object1 implements Identifiable {
            // ...
        }
        
        public class Object2 implements Identifiable {
            // ...
        }
        
        

        Tu pourras ainsi faire une méthode qui accepte des listes d'objets Identifiable qui fonctionnera avec des listes contenant des Objet1 et/ou des Objet2.

        En passant, il est préférable d'utiliser les interfaces pour les types de variables et paramètres, plutôt que les types concrets (quand c'est possible).

        Concrètement, pour les listes, il vaut mieux utiliser l'interface List pour le type de tes variables/paramètres.

        // Variable
        List<Identifiable> maListe = new ArrayList<>();
        
        // Paramètre
        public void methode(List<Identifiable> maListe, ...)

        Ca rendra ton code plus adaptable et flexible car il fonctionnera avec tous les types qui implémentent l'interface List (ArrayList, LinkedList, etc).

        -
        Edité par brubru777 7 avril 2021 à 14:59:00

        • Partager sur Facebook
        • Partager sur Twitter
          7 avril 2021 à 16:25:33

          Son problème si j'ai bien compris c'est qu'il veut utiliser des méthodes en plus de getId qui ne sont pas communes aux 2 classes et utiliser le polymorphisme paramétrique pour avoir accès à ces méthodes avec un nom de fonction unique.

          Mais le polymorphisme paramétrique ne fonctionne pas en java si la seule différence entre les 2 fonctions est le type du generic, à cause du erasure type qui rend la signature identique.

          • Partager sur Facebook
          • Partager sur Twitter
            7 avril 2021 à 18:20:37

            Oui c'est ca play50hz. mais merci quand meme brubru.

            du coup je vais dupliquer ma fonction. je n'ai besoin de passer que deux types d'arraylist et la fonction ne fait que 54 lignes. ce n'est pas enorme.

            • Partager sur Facebook
            • Partager sur Twitter
              8 avril 2021 à 10:51:03

              TagAda7 a écrit:

              Oui c'est ca play50hz. mais merci quand meme brubru.

              du coup je vais dupliquer ma fonction. je n'ai besoin de passer que deux types d'arraylist et la fonction ne fait que 54 lignes. ce n'est pas enorme.


              54 lignes o_O la fonction ! C'est juste énorme. Tu peux créer des sous fonctions pour simplifier le code ?
              • Partager sur Facebook
              • Partager sur Twitter
                8 avril 2021 à 12:20:45

                2 ou 20 arraylist c'est la même chose, pour le compilo, List<Truc> et List<Bidule> c'est le même en ce qui concerne la signature de la fonction.

                +1 Pour les 54 lignes, à moins de cas particulier, dépasser les 10-15 ça fait beaucoup.

                Tout ça ressemble pas mal à des défauts de conception générale, tu pourrais donner un contexte plus global pour voir où ça cloche?

                • Partager sur Facebook
                • Partager sur Twitter

                passer une arraylist generique en argument

                × 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