98 votes

Comment une méthode surchargée est-elle choisie lorsqu'un paramètre est la valeur NULL littérale?

Je suis tombé sur cette question à un quizz,

La sortie de ce programme est « Version de la chaîne ». Mais je n’étais pas en mesure de comprendre pourquoi en passant une valeur null à une méthode surchargée, a choisi la version de la chaîne. Est null, une variable chaîne pointant sur rien ?

Toutefois, lorsque le code est modifié

Il donne une erreur de compilation disant « la méthode method(StringBuffer) est ambigu pour le type MoneyCalc »

102voto

Jon Skeet Points 692016

Est null à une variable de type Chaîne de pointage pour rien ?

Une référence null peut être convertie en une expression d'un type de classe. Ainsi, dans le cas d' String, ce qui est bien:

String x = null;

L' String de surcharge ici est choisi parce que le compilateur Java choisit le plus spécifique de la surcharge, conformément à l'article 15.12.2.5 de la JLS. En particulier:

Le secteur informel de l'intuition est qu'une méthode est plus précise qu'une autre si l'une invocation gérées par la première méthode peut être transmise à l'autre sans un moment de la compilation type d'erreur.

Dans votre deuxième cas, les deux méthodes sont toujours applicables, mais ni String ni StringBuffer est plus spécifique que l'autre, par conséquent, ni la méthode est plus précise que l'autre, d'où l'erreur du compilateur.

9voto

Edwin Dalorzo Points 19899

En outre, la JLS 3.10.7 déclare également que "null est une valeur littérale de la valeur "null". Par conséquent, il existe un type appelé "null".

Plus tard, le JLS 4.1 les états qu'il existe un type null est impossible de déclarer des variables, mais vous pouvez l'utiliser à travers le littéral null. Plus tard, il dit:

La référence null peut toujours subir un élargissement de la conversion de référence pour tout type de référence.

Pourquoi le compilateur choisit de l'élargir à l'Chaîne pourrait être bien expliquée dans le Jon de réponse.

2voto

JonH Points 20454

Vous pouvez affecter une valeur string à une valeur null afin qu'elle soit valide et que la commande pour Java et la plupart des langages de programmation s'adapte au type le plus proche, puis à l'objet.

2voto

asteri Points 5836

Pour répondre à la question dans le titre: null n'est ni un String ni Object, mais une référence à l'un ou l'autre peut être attribué à l' null.

Je suis d'ailleurs surpris que ce code compile. J'ai essayé quelque chose de similaire auparavant et j'ai eu une erreur de compilation, en disant que l'appel a été ambigu.

Toutefois, dans ce cas, il semble que le compilateur est le choix de la méthode qui est la plus faible de la chaîne alimentaire. C'est en supposant que vous souhaitez au moins la version générique de la méthode dans l'ordre pour vous aider.

Je vais voir si je peux creuser l'exemple où j'ai obtenu une erreur de compilateur en cette (presque) exactement le même scénario, cependant...]

EDIT: je vois. Dans la version que j'ai fait, j'ai eu deux méthodes surchargées d'accepter un String et Integer. Dans ce scénario, il n'y a pas de "plus spécifiques" paramètre (comme en Object et String), de sorte qu'il ne peut pas choisir entre eux, à la différence dans votre code.

Très cool question!

-1voto

northpole Points 5793

Je dirais ni l'un ni l'autre. NULL est un état et non une valeur. Consultez ce lien pour plus d'informations à ce sujet (l'article s'applique à SQL, mais je pense que cela aide également à répondre à votre question).

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