Consider the following Java code:
public class MoneyCalc {</p> <p>public void method(Object o) {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 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);
}
}
Here, the overloaded method selected when passing a null value as a parameter is the "method(String s)" method. This may seem counterintuitive, as null is not explicitly declared as a String variable.
Despite the name "Object Version," the "method(Object o)" overload is not limited to objects. In Java, null can be converted to an expression of any class type, including String. Therefore, the following assignment is valid:
String x = null;<br>
The Java compiler chooses the most specific overload, as per the Java Language Specification (JLS) section 15.12.2.5. Informally, a method is more specific if invocations handled by it could also be handled by another method without a compile-time type error.
In this case, the "method(String s)" overload is more specific because it can handle invocations with String arguments. The "method(Object o)" overload, on the other hand, can handle any object type, including null. However, it cannot handle invocations with String arguments without casting, which would result in a compile-time error.
If we modify the code to include an additional "method(StringBuffer sb)" overload, we encounter an ambiguous overload error:
public class MoneyCalc {</p> <p>public void method(StringBuffer sb) {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 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);
}
}
This is because neither the "method(StringBuffer sb)" nor the "method(String s)" overload is more specific than the other. They can both handle null arguments, and neither can handle the other's argument type without casting.
The above is the detailed content of Why does Java's overloaded method selection choose `method(String s)` when passed `null`?. For more information, please follow other related articles on the PHP Chinese website!