J'ai ajouté trois méthodes avec des paramètres:
public static void doSomething(Object obj) {
System.out.println("Object called");
}
public static void doSomething(char[] obj) {
System.out.println("Array called");
}
public static void doSomething(Integer obj) {
System.out.println("Integer called");
}
Lorsque j'appelle doSomething(null)
, le compilateur renvoie une erreur en tant que méthodes ambiguës . Il en est de la question parce que Integer
et les char[]
méthodes ou Integer
et Object
méthodes?
java
oop
null
overloading
Phani
la source
la source
Integer
enint
.reference to doSomething is ambiguous
erreur.Réponses:
Java essaiera toujours d'utiliser la version applicable la plus spécifique d'une méthode disponible (voir JLS §15.12.2 ).
Object
,char[]
etInteger
peuvent tous prendrenull
comme valeur valide. Par conséquent, les 3 versions sont applicables, Java devra donc trouver la plus spécifique.Puisqu'il
Object
s'agit du super-type dechar[]
, la version du tableau est plus spécifique que laObject
-version. Donc, si seulement ces deux méthodes existent, lachar[]
version sera choisie.Lorsque les versions
char[]
etInteger
sont disponibles, les deux sont plus spécifiques,Object
mais aucune n'est plus spécifique que l'autre, de sorte que Java ne peut pas décider laquelle appeler. Dans ce cas, vous devrez mentionner explicitement celui que vous souhaitez appeler en convertissant 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 que cela ne se produit que lorsque vous appelez explicitement une méthode avec
null
ou avec une variable d'un type plutôt non spécifique (commeObject
).Au contraire, l'invocation suivante serait parfaitement claire:
Bien que vous passiez toujours la valeur
null
, Java sait exactement quelle méthode appeler, car elle prendra en compte le type de variable.la source
Chaque paire de ces trois méthodes est ambiguë en soi lorsqu'elle est appelée avec un
null
argument. Parce que chaque type de paramètre est un type de référence.Voici les trois façons d'appeler une de vos méthodes spécifiques avec null.
Puis-je suggérer de supprimer cette ambiguïté si vous envisagez d'appeler ces méthodes avec des
null
arguments. Une telle conception invite à des erreurs dans le futur.la source
Integer
-char[]
pair est ambigu, car dans deux autres cas, le compilateur Java peut choisir le choix le plus spécifique, comme @JoachimSauer décrit.null
comme paramètre. Sous cette condition préalable, les trois paires sont ambiguës. Pour le cas général, je conviens que seule laInteger - char[]
paire est ambiguë.doSomething(null)
depublic static void doSomething(String str) { System.out.println("String called"); }
Cela retournera la chaîne appelée.null
est une valeur valide pour l'un des trois types; donc le compilateur ne peut pas décider quelle fonction utiliser. Utilisez quelque chose commedoSomething((Object)null)
ou à ladoSomething((Integer)null)
place.la source
Chaque classe en Java étend la classe Object, et même la classe Integer étend également Object. Par conséquent, Object et Integer sont tous deux considérés comme une instance Object. Ainsi, lorsque vous passez null comme paramètre, le compilateur se confond avec la méthode objet à appeler, c'est-à-dire avec le paramètre Object ou le paramètre Integer, car ils sont tous les deux des objets et leur référence peut être nulle. Mais les primitives de java n'étendent pas Object.
la source
J'ai essayé cela et quand il y a exactement une paire de méthodes surchargées et que l'une d'elles a un type de paramètre Object, le compilateur sélectionnera toujours la méthode avec un type plus spécifique. Mais lorsqu'il y a plus d'un type spécifique, le compilateur renvoie une erreur de méthode ambiguë.
Puisqu'il s'agit d'un événement au moment de la compilation, cela ne peut se produire que lorsque l'on passe intentionnellement null à cette méthode. Si cela est fait intentionnellement, il est préférable de surcharger à nouveau cette méthode sans paramètre ou de créer une autre méthode.
la source
il y a une ambiguïté à cause de doSomething (char [] obj) et doSomething (Integer obj).
char [] et Integer sont tous les deux supérieurs pour null, c'est pourquoi ils sont ambigus.
la source
La sortie est Int appelée null et donc l'ambiguïté est avec char [] et Integer
la source