I have added three methods with parameters:
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");
}
When I am calling doSomething(null)
, then compiler throws error as ambiguous methods. So is the issue because Integer
and char[]
methods or Integer
and Object
methods?
The output is Int called null and so ambiguity is with char[] and Integer
there is an ambiguity because of doSomething(char[] obj) and doSomething(Integer obj) .
char[] and Integer both are same superior for null thats why they are in ambiguous .
Every class in Java extends Object class.Even Integer class also extends Object. Hence both Object and Integer are considered as Object instance. So when you pass null as a parameter than compiler gets confused that which object method to call i.e. With parameter Object or parameter Integer since they both are object and their reference can be null. But the primitives in java does not extends Object.
I Have tried this and when there is exactly one pair of overloaded method and one of them has a parameter type Object then the compiler will always select the method with more specific type. But when there is more than one specific type, then the compiler throws an ambiguous method error.
Since this is a compile time event, this can only happen when one intentionally passes null to this method. If this is done intentionally then it is better to overload this method again with no parameter or create another method altogether.
Java will always try to use the most specific applicable version of a method that's available (see JLS §15.12.2).
Object
,char[]
andInteger
can all takenull
as a valid value. Therefore all 3 version are applicable, so Java will have to find the most specific one.Since
Object
is the super-type ofchar[]
, the array version is more specific than theObject
-version. So if only those two methods exist, thechar[]
version will be chosen.When both the
char[]
andInteger
versions are available, then both of them are more specific thanObject
but none is more specific than the other, so Java can't decide which one to call. In this case you'll have to explicitly mention which one you want to call by casting the argument to the appropriate type.Note that in practice this problem occurs far more seldom than one might think. The reason for this is that it only happens when you're explicitly calling a method with
null
or with a variable of a rather un-specific type (such asObject
).On the contrary, the following invocation would be perfectly unambiguous:
Although you're still passing the value
null
, Java knows exactly which method to call, since it will take the type of the variable into account.null
is a valid value for any of the three types; so the compiler cannot decide which function to use. Use something likedoSomething((Object)null)
ordoSomething((Integer)null)
instead.