Surcharge des appels de méthode avec le paramètre null

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);