Considérez le code Java suivant :
classe publique MoneyCalc {</p> <p>méthode public void (Object o) {</p> <pre class="brush:php;toolbar:false"> System.out.println("Object Verion");
}
méthode public void (String s) {
System.out.println("String Version");
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc(); question.method(null);
}
}
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.
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>
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.
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> <pre class="brush:php;toolbar:false"> System.out.println("StringBuffer Verion");
}
méthode public void (String s) {
System.out.println("String Version");
>
public static void main(String args[] ) {
MoneyCalc question = new MoneyCalc(); question.method(null);
}
}
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!