fonctions arguments et valeur de retour à type variable

a marqué ce sujet comme résolu.

Bonjour,

J’aimerais bien pouvoir créer des fonctions ayant des arguments et des valeurs de retour de type variable (un peu comme en Python).

Je trouve ça un peu contraignant, de devoir choisir le type de données que l’on veut utiliser…

Est-ce que quelqu’un qui s’y connait mieux que moi (je suis un grand débutant en Java) aurait une idée ?

Merci d’avance,

@flopy78

Salut,

C’est quoi ton cas d’usage concret ? Qu’est-ce que tu cherches à faire ? J’ai l’impression que tu es dans un cas où tu veux tordre ton outil dans une direction opposée à ce pour quoi il a été conçu et il y a peut être de meilleures solutions à te proposer selon ton objectif.

Pour faire une analogie, si on veut attacher un tableau et qu’on a un tournevis, la meilleure solution n’est probablement pas de s’en servir pour planter un clou. ;)

Bonjour,

Merci pour votre réponse. Par exemple, si je veux créer une fonction qui transforme des nombres en chaines de caractères, je vais être obligé d’en faire une pour les int, une pour les float, une pour les long et une pour les double… C’est un peu lourd !

Merci beaucoup,

@flopy78

L’overloading (ou surchagre de méthodes), c’est avoir plusieurs méthodes avec le même nom et type de retour mais des paramètres différents (soit différent type et/ou différent nombre d’arguments).

Par exemple, si tu regardes la classe PrintStream qui est utilisée quand tu fais un System.out.println(...);, tu peux voir les méthodes suivantes:

    public void println(int x) {
        //...
    }
    public void println(long x) {
        //...
    }
    public void println(float x) {
        //...
    }
    public void println(String x) {
        //...
    }
    //...

Mais comme l’a dit Moté, il serait utile d’avoir un cas concret de ce que tu veux mettre en place car il existe d’autres possibilités selon le problème que tu cherches à résoudre.

Bonjour,

Merci pour votre réponse.

Un exemple concret auquel j’ai été confronté m’est revenu en tête : une fonction qui prend en argument un tableau et le retourne. Est-ce que l’on est vraiment obligé de faire une fonction pour les tableaux de int, une autre pour les tableaux de float, et encore une autre pour les tableaux de String, etc. ?

J’aimerais bien pouvoir rédiger une seule fois la fonction, si possible… C’est un peu lourd de rédiger plusieurs fois la même chose…

Merci d’avance,

@flopy78

Alors pour cet exemple, comme dans beaucoup de langages, tu n’as pas besoin de coder ça toi-même, tu peux utiliser ce que la bibliothèque de base te fournit. Par exemple, pour une liste d’integers:

jshell> List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
myList ==> [1, 2, 3, 4, 5]

jshell> Collections.reverse(myList);

jshell> myList;
myList ==> [5, 4, 3, 2, 1]

Mais si tu demandes ceci plus par curiosité, tu peux regarder comment est implémentée cette méthode dans la class Collections. Et tu verras qu’on utilise des generics:

     public static void reverse(List<?> list) {
        //Je commente le corps car il importe peu ici
    }

En utilisant List<?>, la méthode nous dit qu’elle prend en entrée une liste d’éléments mais le type de ces éléments importe peu. Je t’invite à t’informer sur les generics si tu veux en savoir plus car ils sont puissants et vont plus loin que ce simple exemple.

Banni

Bonjour, En utilisant des génériques, vous pouvez créer des fonctions avec des arguments de type variable et des valeurs de retour. Les génériques vous permettent de créer des classes, des interfaces et des méthodes qui peuvent interagir avec différents types d’objets. Vous pouvez utiliser des génériques pour écrire des fonctions qui acceptent différents types d’arguments et renvoient différents types de valeurs.

Alors mon pote, voici un exemple de méthode générique qui prend n’importe quel type de tableau et renvoie le premier élément : public static <T> T getFirst(T[] array) { return array[0]; }

T> déclare un paramètre de type générique dans cet exemple. La méthode prend un tableau de type T[] et renvoie une valeur T.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte