Si vous lisez ceci, il est probable que vous ayez obtenu une erreur La méthode X est ambiguë pour le type Y
lors de la compilation d’un programme Java dans le terminal ou dans n’importe quel IDE Java.
Appel de méthode ambigu en Java
Je vais expliquer pourquoi l’erreur d’appel de méthode ambiguë en Java se produit avec quelques exemples. Cette erreur d’appel de méthode ambiguë survient toujours avec la surcharge de méthode où le compilateur échoue à déterminer quelle méthode surchargée doit être utilisée. Supposons que nous ayons un programme Java comme ci-dessous.
package com.journaldev.errors;
public class Test {
public void foo(Object o) {
System.out.println("Object");
}
public void foo(String s) {
System.out.println("String");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
Le programme ci-dessus se compile parfaitement et lors de son exécution, il imprime « String ». Ainsi, la méthode foo(String s)
a été appelée par le programme. La raison derrière cela est que le compilateur Java tente de trouver la méthode avec les paramètres d’entrée les plus spécifiques pour invoquer une méthode. Nous savons que Object est la classe parente de String, donc le choix était facile. Voici un extrait de la spécification du langage Java.
Si plus d’une méthode membre est à la fois accessible et applicable à une invocation de méthode… Le langage de programmation Java utilise la règle selon laquelle la méthode la plus spécifique est choisie.
La raison pour laquelle je passe « null » est que cela fonctionne pour n’importe quel type d’arguments, si nous passons d’autres objets, le choix de méthode pour le compilateur Java est facile.
La méthode X est ambiguë pour le type Y
Maintenant, ajoutons la méthode ci-dessous au code ci-dessus.
public void foo(Integer i){
System.out.println("Integer");
}
Vous obtiendrez une erreur de compilation car
La méthode foo(Object) est ambiguë pour le type Test
car à la fois la classe String et la classe Integer ont Object comme classe parent et il n’y a pas d’héritage. Ainsi, le compilateur Java ne considère aucun d’entre eux comme étant plus spécifique, d’où l’erreur d’appel de méthode ambiguë.
package com.journaldev.strings;
public class Test {
public void foo(Object o) {
System.out.println("Object");
}
public void foo(Exception e) {
System.out.println("Exception");
}
public void foo(NullPointerException ne) {
System.out.println("NullPointerException");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
Comme expliqué ci-dessus, ici foo(NullPointerException ne)
est la méthode la plus spécifique car elle est héritée de la classe Exception et donc ce code se compile correctement et lorsqu’il est exécuté, il affiche « NullPointerException ». J’espère que cet article clarifie tout doute que vous pourriez avoir concernant l’erreur de compilation d’appel de méthode ambiguë en Java, veuillez commenter si vous souhaitez ajouter quelque chose ou si vous avez des confusions à ce sujet.