Deux méthodes Java ont-elles le même nom avec différentes type de retour? Le type de retour des méthodes est différent et elles sont déclarées avec le nom de la même méthode.
Est-ce permis?
Si les deux méthodes ont les mêmes types de paramètre, mais un type de retour différent de ce qui n’est pas possible. De Spécification du langage Java, Java SE 8 Edition, §8.4.2. Signature de la méthode :
Deux méthodes ou constructeurs, M et N, ont la même signature s'ils portent le même nom, les mêmes paramètres de type (le cas échéant) (§8.4.4) et, après avoir adapté les 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 (leur signature est donc différente), c'est possible. C'est ce qu'on appelle la surcharge.
Seulement s'ils acceptent des paramètres différents. S'il n'y a pas de paramètres, 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
Selon le JLS, vous ne pouvez pas, toutefois, à cause d'une fonctionnalité/d'un 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");
}
}
Impressions
here - Integer
here - Short
here - Byte
here - Void
Pour plus de détails, lisez mon article ici
Non. C++ et Java interdisent tous les deux la surcharge sur le type de retour d'une fonction. La raison en est que la surcharge sur le type de retour peut être source de confusion (il peut être difficile pour les développeurs de prédire quelle surcharge sera appelée) En fait, certains affirment que toute surcharge peut être source de confusion à cet égard et recommande de ne pas le recommander, mais même ceux qui sont en faveur de la surcharge semblent convenir que cette forme particulière est trop source de confusion.
Vous pouvez avoir deux méthodes avec les mêmes arguments et différents types de retour 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; }
}
Seulement si leurs déclarations de paramètres sont différentes de la mémoire.
La documentation de Java indique:
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.
Voir: http://docs.Oracle.com/javase/tutorial/Java/javaOO/methods.html
Même si c'est un vieux fil, certains sont peut-être intéressés.
Si vous avez le choix d'utiliser la méthode identique dans la même classe et d'archiver des types de retour différents, utilisez des génériques: Oracle Lesson Generics
Exemple simple pour la classe de détenteur de valeur générique:
class GenericValue<T> {
private T myValue;
public GenericValue(T myValue) { this.myValue = myValue; }
public T getVal() { return myValue; }
}
Et utilisez-le comme ceci:
public class ExampleGenericValue {
public static void main(String[] args) {
GenericValue<Integer> intVal = new GenericValue<Integer>(10);
GenericValue<String> strVal = new GenericValue<String>("go on ...");
System.out.format("I: %d\nS: %s\n", intVal.getVal(), strVal.getVal());
}
}
... donnera le résultat suivant:
I: 10
S: go on ...
Si c'est dans la même classe avec le même nombre de paramètres avec les mêmes types et le même ordre, alors ce n'est pas possible par exemple:
int methoda(String a,int b) {
return b;
}
String methoda(String b,int c) {
return b;
}
si le nombre de paramètres et leur type sont identiques mais que l'ordre est différent, cela est possible car cela entraîne une surcharge de la méthode. Cela signifie que si la signature de la méthode est la même, ce qui inclut le nom de la méthode avec le nombre de paramètres, leur type et leur ordre de définition.