web-dev-qa-db-fra.com

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

Pourquoi n'est-il pas possible de surcharger une fonction simplement en changeant le type de retour? Est-ce que cela changera dans une future version de Java?

En passant, juste pour référence, est-ce possible en C++?

77
nunos

Vous ne pouvez pas le faire en Java ni en C++. La logique est que la valeur de retour n'est pas suffisante pour que le compilateur sache quelle fonction appeler:

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

...
foo(); // which one?
136
Alexander Gessler

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

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

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

46
Oded

Avant Java 5.0, lorsque vous substituez une méthode, les paramètres et le type de retour doivent correspondre exactement. En Java 5.0, il introduit une nouvelle fonction 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 d'une sous-classe peut renvoyer un objet dont le type est une sous-classe du type renvoyé par la méthode avec la même signature dans la superclasse.

21
Daneel S. Yaitskov

Les méthodes Overloaded en Java peuvent avoir différents types de retour car l'argument est également différent.

Découvrez 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");
    }

}
5
Abdullah Khan

Le compilateur ne considère pas le type de résultat 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.

1
Ganesh

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

La seule façon dont Java peut 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.

1
Vinayak

Le compilateur ne considère pas le type de résultat 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 conscient de l'exécution de la fonction, vous saurez que, lorsque nous appelons une fonction, la partie définition est exécutée et nous avons enfin besoin de l'instruction return plus de fonctions avec le même nom et avec le même type et non. d’arguments puis au moment de l’appel, comment le compilateur saura lequel appeler, car le nom de la fonction et les paramètres sont identiques. Au moment de l'appel, l'accent sera mis sur les arguments et le nom de la fonction. Après l'achèvement de la définition de la fonction, nous traiterons enfin de l'instruction return.

L'erreur 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.

0
LearnAndHelp