84 votes

Deux méthodes Java peuvent-elles avoir le même nom avec des types de retour différents ?

Deux méthodes Java peuvent-elles avoir la même même nom avec différents type de retour ? Le type de retour des méthodes est différent et elles sont déclarées avec le même nom de méthode.

Est-ce que c'est autorisé ?

81voto

uthark Points 3507

Si les deux méthodes ont le même type de paramètre, mais un type de retour différent, ce n'est pas possible. À partir de Spécification du langage Java, édition Java SE 8, §8.4.2. Signature de la méthode :

Deux méthodes ou constructeurs, M et N, ont la même signature s'ils ont le même nom, les mêmes paramètres de type (le cas échéant) (§8.4.4), et, après adaptation des types de paramètres formels de N aux paramètres de type de M, les mêmes types de paramètres formels.

Si les deux méthodes ont des types de paramètres différents (donc une signature différente), c'est possible. C'est ce qu'on appelle la surcharge.

32voto

Kaivosukeltaja Points 6219

Seulement, s'ils acceptent des paramètres différents. S'il n'y a pas de paramètres, alors vous devez avoir des noms différents.

int doSomething(String s);
String doSomething(int); // this is fine

int doSomething(String s);
String doSomething(String s); // this is not

20voto

Peter Lawrey Points 229686

Selon le JLS, vous ne pouvez pas, mais en raison d'une fonctionnalité/bogue dans le compilateur Java 6/7 (JDK d'Oracle, OpenJDK, JDK d'IBM), vous pouvez avoir différents types de retour pour la même signature de méthode si vous utilisez des génériques.

public class Main {
    public static void main(String... args) {
        Main.<Integer>print();
        Main.<Short>print();
        Main.<Byte>print();
        Main.<Void>print();
    }

    public static <T extends Integer> int print() {
        System.out.println("here - Integer");
        return 0;
    }
    public static <T extends Short> short print() {
        System.out.println("here - Short");
        return 0;
    }
    public static <T extends Byte> byte print() {
        System.out.println("here - Byte");
        return 0;
    }
    public static <T extends Void> void print() {
        System.out.println("here - Void");
    }
}

Imprimés

here - Integer
here - Short
here - Byte
here - Void

Pour plus de détails, lire mon article ici

8voto

Michael Aaron Safyan Points 45071

Non. C++ et Java interdisent tous deux la surcharge du type de retour d'une fonction. La raison en est que la surcharge du type de retour peut prêter à confusion (il peut être difficile pour les développeurs de prévoir quelle surcharge sera appelée). En fait, certains soutiennent que toute surcharge peut être déroutante à cet égard et la déconseillent, mais même ceux qui favorisent la surcharge semblent convenir que cette forme particulière est trop déroutante.

5voto

TofuBeer Points 32441

Vous pouvez avoir deux méthodes avec les mêmes arguments et des types de retour différents uniquement si l'une des méthodes est héritée et que les types de retour sont compatibles.

Par exemple :

public class A
{
    Object foo() { return null; }
}

public class B
    extends A
{
    String foo() { return null; }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X