Surcharge avec un type de retour différent en Java?

104

Pourquoi n'est-il pas possible de surcharger une fonction simplement en modifiant le type de retour? Cela changera-t-il dans une future version de Java?

Au fait, juste pour référence, est-ce possible en C ++?

nunos
la source
1
duplication possible d' une surcharge
KNU
KNU, ​​l'autre réponse diffère en ce qu'elle pose la question en termes généraux, non spécifiques à la langue. Il est également intéressant de noter que la réponse acceptée à une autre question va plus loin en spécifiant que la JVM Java permet de le faire avec la manipulation des internes.
J Woodchuck

Réponses:

157

Vous ne pouvez pas le faire en Java et vous ne pouvez pas le faire en C ++. La raison en est que la valeur de retour seule n'est pas suffisante pour que le compilateur détermine quelle fonction appeler:

public int foo() {...}
public float foo() {..}

...
foo(); // which one?
Alexander Gessler
la source
3
J'ai toujours pensé que si nous faisions quelque chose comme int i = foo () ou float f = foo (), il saurait lequel, mais si l'instruction est juste la fonction que le compilateur ne connaîtrait pas. Je le sais. Merci.
nunos
7
@nunos même si c'était float f = foo (), le compilateur ne serait pas capable de le comprendre car les deux int seraient une entrée valide pour un float. Comparez float f = 7; (7 est-il un float ou un int?)
NomeN
5
@NomeN Mais votre déclaration suggère que func (int i) et func (float i) seraient indiscernables pour le compilateur - et nous savons tous que ce n'est pas vrai. La vraie raison est donnée par Oded (voir la réponse suivante) - il s'agit de la signature de la méthode. Et, btw. 7 est définitivement un entier tandis que 7,0 ou 7f est flottant ;-)
Ta Sas
7
7.0 n'est pas float, c'est double.
fredoverflow
3
Le fait que foo();sans un type de retour serait ambigu n'est pas nécessairement une raison pour l'interdire en tant que surcharge. Il y a des arguments qui peuvent provoquer une ambiguïté (par exemple foo(null);), mais cela ne rend pas la surcharge intrinsèquement invalide.
shmosel le
48

La raison en est que les surcharges en Java ne sont autorisées que pour les méthodes avec des signatures différentes .

Le type de retour ne fait pas partie de la signature de la méthode et ne peut donc pas être utilisé pour distinguer les surcharges.

Voir Définition de méthodes à partir des didacticiels Java.

Oded
la source
4
Mais pourquoi le type de retour ne fait-il pas partie de la signature
andho
51
oh "juste parce que"! Je vois.
andho
3
Le type de retour est une partie de la signature de méthode. Regardez simplement le désassemblage de la classe.
konmik
2
Ce n'est vraiment pas @konmik - pas par les règles de la surcharge de méthodes. Essayez-le. Même nom de méthode, mêmes types de paramètres dans le même ordre, différents types de retour. Ne compile pas.
Oded le
3
Oui, car le type de retour ne fait pas partie de la signature . La signature est - le nom de la méthode + les types et l'ordre de son paramètre. Lisez le lien que j'ai fourni dans ma réponse: "La signature de la méthode déclarée ci-dessus est: calculateAnswer(double, int, double, double)". Vérifiez que le type de retour n'est pas inclus, @konmik.
Oded le
22

Avant Java 5.0, lorsque vous remplacez une méthode, les paramètres et le type de retour doivent correspondre exactement. Dans Java 5.0, il introduit une nouvelle fonctionnalité appelée type de retour covariant. Vous pouvez remplacer une méthode avec la même signature mais renvoie une sous-classe de l'objet renvoyé. En d'autres termes, une méthode dans une sous-classe peut retourner un objet dont le type est une sous-classe du type renvoyé par la méthode avec la même signature dans la superclasse.

Daneel S. Yaitskov
la source
3
J'ai été déconcerté quand j'ai vu cela pour la première fois. Merci d'avoir expliqué pourquoi cela est possible!
Dylan Knowles
2
la surcharge et le dépassement sont différents. La surcharge n'implique pas (nécessairement) l'héritage
senseiwu
3
Cette réponse peut sembler trompeuse pour un débutant en Java, car ce n'est pas du tout pertinent avec la surcharge , c'est primordial - complètement autre chose.
azizbekian
4

Overloaded Les méthodes en java peuvent avoir des types de retour différents étant donné que l'argument est également différent.

Consultez l'exemple de code.

public class B {

    public String greet() {
        return "Hello";
    }

    //This will work
    public StringBuilder greet(String name) {
        return new StringBuilder("Hello " + name);
    }

    //This will not work
    //Error: Duplicate method greet() in type B
    public StringBuilder greet() {
        return new StringBuilder("Hello Tarzan");
    }

}
Abdullah Khan
la source
fondamentalement le type de retour n'est pas pris en compte, seuls les arguments, triste mais vrai
Alexander Mills
1

Le compilateur ne prend pas en compte le type de retour lors de la différenciation des méthodes, vous ne pouvez donc pas déclarer deux méthodes avec la même signature même si elles ont un type de retour différent.

Ganesh
la source
1

Le type de retour n'a pas d'importance lors de la surcharge d'une méthode. Nous devons simplement nous assurer qu'il n'y a pas d'ambiguïté!

La seule façon pour Java de savoir quelle méthode appeler est de différencier les types de la liste d'arguments. Si le compilateur autorisait deux méthodes avec le même nom et les mêmes types d'arguments, il n'y aurait aucun moyen de déterminer laquelle il devrait appeler.

Vinayak
la source
0

Le compilateur ne prend pas en compte le type de retour lors de la différenciation des méthodes, vous ne pouvez donc pas déclarer deux méthodes avec la même signature même si elles ont un type de retour différent.

Si vous êtes au courant de l'exécution de la fonction, vous serez conscient que lorsque nous appelons une fonction, la partie de définition s'exécute et, enfin, nous avons besoin de l'instruction return, donc nous pouvons dire que return vient après toute la définition de la fonction, c'est pourquoi s'il y en a deux ou plus de fonctions avec le même nom et avec le même type et non. d'arguments au moment de l'appel, comment le compilateur saura lequel appeler, car le nom et les paramètres de la fonction sont les mêmes. Au moment de l'appel, tout d'abord, l'accent sera mis sur les arguments et le nom de la fonction et après l'achèvement de la définition de la fonction, nous traiterons enfin de l'instruction return.

L'erreur de temps de compilation est meilleure que l'erreur d'exécution. Ainsi, le compilateur java génère une erreur de temps du compilateur si vous déclarez la même méthode avec les mêmes paramètres.

Bhanu
la source
En quoi est-ce différent de la réponse acceptée? (De plus, la raison pour laquelle il s'agit d'une erreur de compilation est que le compilateur ne peut pas déterminer la méthode à appeler, alors comment est-il censé générer le code exécutable approprié)
UnholySheep
-2

non pas vraiment possible de cette façon vous ne pouvez surcharger que par aucun argument ou type de données des arguments

MAYANK AMRIT
la source