en Java, j'ai 2 méthodes surchargées et une méthode principale, donc de la méthode principale que j'appelle la méthode surchargée.
public class Test { public static void main(String[] args) throws IOException { doSomething(null); } private static void doSomething(Object o) { System.out.println("method with Object in signature is called."); } private static void doSomething(String s) { System.out.println("method with String in the signature is called."); } }
3 Réponses :
de JLS 15.12 .2.5 (accent ajouté):
Si plus d'une méthode de membre est à la fois accessible et applicable à une invocation de méthode, il est nécessaire de choisir un pour fournir le descripteur pour l'envoi de la méthode d'exécution. Le langage de programmation Java utilise la règle que
la méthode la plus spécifique est choisie forte>. P> L'intuition informelle est qu'une méthode est plus spécifique qu'une autre si l'invocation de la première méthode pouvait être transmise à l'autre sans erreur de compilation. P> blockQquote>
tout ce qui peut être transmis à la méthode code> String code> peut être transmis à la méthode code> code>, tandis que vous pouvez passer des choses au
Objet code> Méthode qui ne peut pas être transmis à la méthode code> String code> (par exemple,
nouvel objet () code>) (*); Donc, la méthode code> string code> est plus spécifique, de sorte que celle choisie. p>
(*) Cette clause est importante: si vous remplacez l'objet
code> méthode avec, disons: p>
xxx pré> alors il y aurait des choses que vous pourriez passer à
dosomething (chaîne) code> que vous ne pouviez pas passer
DOSMATHIAT (INTEGER) CODE>; Et il y aurait des choses que vous pourriez passer à
DOSMATHIAT (INTEGER) CODE> que vous ne pouviez pas passer à
Dosomething (String) Code>. Dans ce cas, ni plus spécifique, l'invocation de la méthode serait donc considérée comme ambiguë. P> p>
J'étais sur le point de suggérer le changement que vous venez de faire!
Dosomething (String) Code> et
Dosomething (Entier) CODE> SONT PAS I> AMBIGUÉ, car aucune chaîne ne pouvait jamais être transmise en tant qu'oeur et aucun entier ne pouvait jamais être passé en tant que chaîne.
@ Amadán Dosomething (null) code> serait ambigu . Et c'est ambiguë précisément parce que "aucune chaîne ne pouvait jamais être transmise comme entier et qu'aucun entier ne pouvait jamais être passé en chaîne".
@Andyturner c'est correct. Mais ce serait la même chose avec dosomething (objet) code> et
DOSOMOD (String) code>.
@ Amadán no. Veuillez lire attentivement ma réponse et Essayez-le .
@Andyturner d'accord. J'ai appris quelque chose aujourd'hui, merci. Mais je vous suggère de modifier votre réponse pour effacer que vous parlez du scénario de paramètres NULL! Je pense aussi que l'on devrait plutôt éviter la surcharge. C'est une source pour trop de confusion.
Oui, j'ai essayé de mettre en œuvre, si je fais la méthode dosomique (entier I) au lieu de dosage (objet o), et Eclipse montre une erreur de dire "La méthode dossition" La méthode dosomething (entier) est ambiguë pour le test de type "
@AndyTurner Merci pour la réponse. J'essaie de comprendre votre réponse, mais il est peu difficile de comprendre. Pouvez-vous l'expliquer en terminologie simple?
@DHAVALBHOOT dans la case originale ( objet code> vs
string code>), n'importe quoi i> peut être transmis à l'objet
code> surcharge, mais Seuls Certains i> choses (
strings code> et
null code>) peuvent être transmis à la chaîne code> surcharge. Par conséquent, c'est la version plus spécifique et tout ce que peut transmettre i> être transmis à la chaîne i> String code> surcharger sera (et tout ce que ne peut pas i> être transmis au
String CODE> La surcharge sera transmise à l'objet code> code> surcharge).
@Dhavalbhoot dans le cas de INTEGER code> vs.
string code>, ni plus spécifique, car le domaine d'un (c'est-à-dire que peut être transmis) n'est pas un Sous-ensemble I> du domaine de l'autre (comme c'est le cas avec
chaîne code> vs. code> objet code>).
en Java toujours la version la plus spécifique de la méthode est choisie sur le générique. Si le paramètre transduit est de type chaîne code>, il utilisera toujours la méthode avec
String code> paramètre plutôt que générique
objet p> one. P>
Java suit une approche de liaison anticipée afin de la compilation, il choisit la méthode la plus spécifique. La méthode la plus spécifique est choisie en assortissant un certain nombre de paramètres et de type de paramètre en cas de surcharge de la méthode. Dans votre cas pour résoudre le type d'appel de méthode. du paramètre est utilisé pour résoudre l'appel de la méthode car le nombre de paramètres est égal dans les deux méthodes. P>
Pouvez-vous expliquer pourquoi pensez-vous que cela appellera la méthode code> objet code>?
Stackoverflow.com/Questtions/39189080
@Eran J'aime me répéter .