0
votes

Méthode surcharge de la manière dont il décide d'appeler quelle version de la méthode surchargée dans un cas ci-dessous

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 commentaires

Pouvez-vous expliquer pourquoi pensez-vous que cela appellera la méthode objet ?


Stackoverflow.com/Questtions/39189080


@Eran J'aime me répéter .


3 Réponses :


8
votes

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 .

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.

tout ce qui peut être transmis à la méthode String peut être transmis à la méthode , tandis que vous pouvez passer des choses au Objet Méthode qui ne peut pas être transmis à la méthode String (par exemple, nouvel objet () ) (*); Donc, la méthode string est plus spécifique, de sorte que celle choisie.


(*) Cette clause est importante: si vous remplacez l'objet méthode avec, disons: xxx

alors il y aurait des choses que vous pourriez passer à dosomething (chaîne) que vous ne pouviez pas passer DOSMATHIAT (INTEGER) ; Et il y aurait des choses que vous pourriez passer à DOSMATHIAT (INTEGER) que vous ne pouviez pas passer à Dosomething (String) . Dans ce cas, ni plus spécifique, l'invocation de la méthode serait donc considérée comme ambiguë.


10 commentaires

J'étais sur le point de suggérer le changement que vous venez de faire!


Dosomething (String) et Dosomething (Entier) SONT PAS 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) 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) et DOSOMOD (String) .


@ 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 vs string ), n'importe quoi peut être transmis à l'objet surcharge, mais Seuls Certains choses ( strings et null ) peuvent être transmis à la chaîne surcharge. Par conséquent, c'est la version plus spécifique et tout ce que peut transmettre être transmis à la chaîne String surcharger sera (et tout ce que ne peut pas être transmis au String La surcharge sera transmise à l'objet surcharge).


@Dhavalbhoot dans le cas de INTEGER vs. string , ni plus spécifique, car le domaine d'un (c'est-à-dire que peut être transmis) n'est pas un Sous-ensemble du domaine de l'autre (comme c'est le cas avec chaîne vs. code> objet ).



1
votes

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 , il utilisera toujours la méthode avec String paramètre plutôt que générique objet one.


0 commentaires

0
votes

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.


0 commentaires