Dupliquer possible:
Surcharge de méthode pour le paramètre NULL
Dans le code ci-dessous la sortie est
Chaîne
et si je supprime la méthode avec le paramètre de type Ssortingng
la sortie est
Objet
Je sais comment la surcharge de méthodes agit lorsque les types de parameters ne correspondent pas exactement, mais je ne comprends pas comment null peut être traité comme un paramètre Object
et / ou Ssortingng
.
Quelle est l’explication pour ça?
class C { static void m1(Object x) { System.out.print("Object"); } static void m1(Ssortingng x) { System.out.print("Ssortingng"); } public static void main(Ssortingng[] args) { m1(null); } }
Il utilise toujours la méthode la plus spécifique selon les spécifications Java , section 15.12.2.5.
L’intro est assez spécifique à ce sujet:
Si plusieurs méthodes membres sont à la fois accessibles et applicables à une invocation de méthode, il est nécessaire d’en choisir une pour fournir le descripteur de la dissortingbution de la méthode d’exécution. Le langage de programmation Java utilise la règle selon laquelle 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 une invocation gérée par la première méthode pouvait être transmise à l’autre sans erreur de type à la compilation.
De manière générale, et au moins pour la lisibilité du code, il est toujours préférable d’essayer d’être aussi explicite que possible. Vous pouvez convertir votre null
dans le type correspondant à la signature que vous souhaitez appeler. Mais c’est définitivement une pratique discutable. Cela suppose que tout le monde connaît cette règle et rend le code plus difficile à lire.
Mais c’est une bonne question académique, alors je vous pose une question.
Lorsque plusieurs surcharges correspondent à une signature, Java sélectionne la méthode la plus spécifique parmi celles-ci.
La valeur null
correspond à la fois à Object
et à Ssortingng
, mais Ssortingng
est une sous-classe d’ Object
. Ssortingng
est donc sélectionné. Si vous ajoutez une autre surcharge avec un frère de Ssortingng
dans la hiérarchie des classes, vous obtiendrez une erreur de compilation. \
// DOES NOT COMPILE class C { static void m1(Object x) { System.out.print("Object"); } static void m1(Ssortingng x) { System.out.print("Ssortingng"); } static void m1(Integer x) { System.out.print("Integer"); } public static void main(Ssortingng[] args) { m1(null); } }
Voici un lien vers un article qui traite longuement de votre exemple de code.
Si vous devez forcer l’appel d’une méthode surchargée aprticular en passant null
en paramètre, vous devez le lancer, comme ceci:
m1((Ssortingng)null);
En faisant cela, vous vous assurez que vous appelez la version surchargée correcte de la méthode.
Vous devez définir le type null
pour indiquer à Java quelle fonction vous souhaitez appeler.
Donc vous faites: m1((Object) null);
appeler l’implémentation avec le paramètre Object
et vous faites m1((Ssortingng) null);
appeler l’autre.
1. Comme Ssortingng est aussi un object, la JVM
a du mal à appeler quelle méthode à l’ exécution .
2. Si vous souhaitez spécifier la méthode à appeler à l’exécution, vous pouvez le faire par conversion explicite
par exemple:
m1((Ssortingng)null);