Java essaiera toujours d'utiliser la version applicable la plus spécifique d'une méthode qui est disponible (cf. JLS §15.12.2 ).
Object
, char[]
y Integer
peuvent tous prendre null
comme une valeur valide. Par conséquent, les 3 versions sont applicables, donc Java devra trouver la plus spécifique.
Depuis Object
est le super-type de char[]
la version tableau est plus spécifique que la version Object
-version. Ainsi, si seules ces deux méthodes existent, la char[]
sera choisie.
Lorsque les deux char[]
y Integer
sont disponibles, alors les deux d'entre eux sont plus spécifiques que Object
mais aucune n'est plus spécifique que l'autre, donc Java ne peut pas décider laquelle appeler. Dans ce cas, vous devrez mentionner explicitement celle que vous voulez appeler en coulant l'argument dans le type approprié.
Notez qu'en pratique, ce problème se produit beaucoup plus rarement qu'on ne le pense. La raison en est qu'il ne se produit que lorsque vous appelez explicitement une méthode avec la fonction null
ou avec une variable d'un type assez peu spécifique (telle que Object
).
Au contraire, l'invocation suivante serait parfaitement dépourvue d'ambiguïté :
char[] x = null;
doSomething(x);
Bien que vous passiez toujours la valeur null
En effet, Java sait exactement quelle méthode appeler, puisqu'il tient compte du type de la variable.
3 votes
Il suffit de changer le
Integer
aint
.2 votes
@Mudassir : et qu'est-ce que cela résoudrait exactement ?
2 votes
@Joachim Sauer : Si on change Integer en int, alors null n'est pas référencé aux types primitifs en Java, donc le compilateur ne lancera pas d'erreur.
0 votes
@Joachim Sauer : Il ne jettera pas la
reference to doSomething is ambiguous
erreur.