105 votes

La signature d'une méthode en Java inclut-elle son type de retour ?

La signature d'une méthode dans une classe/interface Java inclut-elle son type de retour ?

Exemple :

Java connaît-il la différence entre ces deux méthodes ?

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

Ou bien est-ce que seuls le nom de la méthode et la liste des paramètres comptent ?

7 votes

À propos, il y avait un bogue dans la gestion des génériques en Java 6 qui vous permettait d'avoir les deux méthodes, car la JVM utilise le type de retour dans la signature et les appelle sélectivement. Ce problème a été corrigé dans Java 7. vanillajava.blogspot.co.uk/2011/02/

151voto

Jops Points 6734

Citation de Docs Oracle :

Définition : Deux des composants de la déclaration d'une méthode sont les éléments suivants signature de la méthode -le nom de la méthode et les types de paramètres.

enter image description here

Depuis que la question a été modifiée pour inclure cet exemple :

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

Non, le compilateur ne fera pas la différence, comme leur signature : myMethod(int param) est le même. La deuxième ligne :

    public char myMethod(int param) {}

vous donnera une erreur de boîte : est déjà définie dans la classe ce qui confirme l'affirmation ci-dessus.

0 votes

Vous voulez donc dire que nous ne pouvons pas avoir deux méthodes dans une classe ayant le même nom de méthode, les mêmes paramètres avec des types de retour différents ?

6 votes

@KasunSiyambalapitiya bien sûr que nous ne pouvons pas. Comment le compilateur saurait-il quelle méthode appeler dans un scénario comme celui-ci ? foo.bar(baz); ?

0 votes

@Jops, et si nous avons le mot-clé throws ? Appartient-il aussi à la signature ?

21voto

Peter Lawrey Points 229686

La signature des méthodes de classe en Java inclut-elle le type de retour ?

En Java, ce n'est pas le cas, mais dans cette JVM, c'est le cas, ce qui peut entraîner une confusion évidente.

La signature d'une méthode d'interface en Java inclut-elle le type de retour ?

La même chose que pour les méthodes de classe.

Ou seulement le nom de la méthode et la liste des paramètres ?

Nom de la méthode et types de paramètres pour Java. Par exemple, les annotations et les noms des paramètres n'ont pas d'importance.

1 votes

Que voulez-vous dire par "En Java, ce n'est pas le cas, mais dans la JVM, c'est le cas". Pouvez-vous préciser comment dans JVM ?

3 votes

@TarunMaganti La JVM inclut le type de retour dans la signature de la méthode. Java en tant que langage ne le fait pas.

3 votes

@xyz c'est quelque chose que vous pouvez voir en lisant le byte code mais pas le code Java. Tout code d'octet le montre.

9voto

Evgeniy Dorofeev Points 52031

Au niveau du bytecode, le "type de retour" fait partie de la signature de la méthode. Considérons ceci

public class Test1  {
    public Test1 clone() throws CloneNotSupportedException {
        return (Test1) super.clone();
    }
}

en bytecode il y a 2 méthodes clone()

public clone()LTest1; throws java/lang/CloneNotSupportedException 

public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 

ils ne diffèrent que par le type de retour.

1 votes

Ceci est trompeur car la méthode d'instance a implicitement l'instance comme premier paramètre. On peut penser que o.m(a) est en fait m(o, a). Ainsi, dans le cas d'un clone, ce qui fait la différence est l'argument et non le type de retour.

7voto

user3580271 Points 101

7voto

PermGenError Points 26936

Spécification du langage Java dit

Deux méthodes ont la même signature si elles ont le même nom et les mêmes types d'arguments.

donc Non, le type de retour ne fait pas partie de la signature de la méthode.

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