Maison > Java > javaDidacticiel > le corps du texte

Pourquoi la sélection de méthode surchargée de Java choisit-elle `method(String s)` lorsqu'elle est passée `null` ?

Susan Sarandon
Libérer: 2024-11-07 04:47:02
original
818 Les gens l'ont consulté

 Why does Java's overloaded method selection choose `method(String s)` when passed `null`?

Sélection de méthode surchargée avec paramètre nul

Considérez le code Java suivant :

classe publique MoneyCalc {</p>
<p>méthode public void (Object o) {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">  System.out.println("Object Verion");
Copier après la connexion

}

méthode public void (String s) {

  System.out.println("String Version");
Copier après la connexion
Copier après la connexion

}

public static void main(String args[]) {

  MoneyCalc question = new MoneyCalc();
  question.method(null);
Copier après la connexion
Copier après la connexion

}
}

Ici, la méthode surchargée sélectionnée lors du passage d'une valeur nulle en tant que paramètre est la méthode "method(String s)". Cela peut sembler contre-intuitif, car null n'est pas explicitement déclaré en tant que variable String.

Comprendre Null en tant qu'objet

Malgré le nom « Version d'objet », la La surcharge "method(Object o)" ne se limite pas aux objets. En Java, null peut être converti en une expression de n'importe quel type de classe, y compris String. Par conséquent, l'affectation suivante est valide :

String x = null;<br>

Détermination de la spécificité de la méthode

Le compilateur Java choisit la surcharge la plus spécifique, conformément à la section 15.12.2.5 de la spécification du langage Java (JLS). De manière informelle, une méthode est plus spécifique si les invocations qu'elle gère peuvent également être gérées par une autre méthode sans erreur de type au moment de la compilation.

Dans ce cas, la surcharge "method(String s)" est plus spécifique car il peut gérer les invocations avec des arguments String. La surcharge "method(Object o)", en revanche, peut gérer n'importe quel type d'objet, y compris null. Cependant, il ne peut pas gérer les invocations avec des arguments String sans conversion, ce qui entraînerait une erreur de compilation.

Surcharge ambiguë avec StringBuffer et String

Si nous modifiez le code pour inclure une surcharge "method(StringBuffer sb)" supplémentaire, nous rencontrons une erreur de surcharge ambiguë :

public class MoneyCalc {</p>
<p>public void method(StringBuffer sb) {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">  System.out.println("StringBuffer Verion");
Copier après la connexion

}

méthode public void (String s) {

  System.out.println("String Version");
Copier après la connexion
Copier après la connexion

>

public static void main(String args[] ) {

  MoneyCalc question = new MoneyCalc();
  question.method(null);
Copier après la connexion
Copier après la connexion

}
}

C'est parce que ni la "method(StringBuffer sb)" ni la "method(String s) " La surcharge est plus spécifique que l'autre. Ils peuvent tous deux gérer les arguments nuls, et aucun des deux ne peut gérer le type d'argument de l'autre sans conversion.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Article précédent:Pourquoi l'ajout d'un « L » à une valeur numérique en Java change-t-il radicalement le résultat d'une opération de multiplication ? Article suivant:Comment obtenir un retour à la ligne pour les widgets sous Android ?
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal