I came across this question in a quiz,
public class MoneyCalc {
public void method(Object o) {
System.out.println("Object Verion");
}
public void method(String s) {
System.out.println("String Version");
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc();
question.method(null);
}
}
The output of this program is “String Version”. But I was not able to understand why passing a null to an overloaded method chose the string version. Is null a String variable pointing to nothing ?
However when the code is changed to,
public class MoneyCalc {
public void method(StringBuffer sb) {
System.out.println("StringBuffer Verion");
}
public void method(String s) {
System.out.println("String Version");
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc();
question.method(null);
}
}
it gives a compile error saying “The method method(StringBuffer) is ambiguous for the type MoneyCalc”
A null reference can be converted to an expression of any class type. So in the case of
String, this is fine:The
Stringoverload here is chosen because the Java compiler picks the most specific overload, as per section 15.12.2.5 of the JLS. In particular:In your second case, both methods are still applicable, but neither
StringnorStringBufferis more specific than the other, therefore neither method is more specific than the other, hence the compiler error.