web-dev-qa-db-fra.com

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

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?

82
jenifer

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.

79
uthark

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
32
Kaivosukeltaja

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

19
Peter Lawrey

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.

6

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; }
}
4
TofuBeer

Seulement si leurs déclarations de paramètres sont différentes de la mémoire.

2
Chris

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

2
Chris

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 ...
2
ChristophS

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.

1
unknown