The JVM decides which overloaded method to call at compile time. I have one example:
public class MainClass{
public static void go(Long n) {System.out.println("takes Long ");}
public static void go(Short n) {System.out.println("takes Short ");}
public static void go(int n) {System.out.println("takes int ");}
public static void main(String [] args) {
short y = 6;
long z = 7;
go(y);
go(z);
go((Short)y);
}
}
According to my understanding, it should print the following:
takes Short
takes Long
takes Short
... but the actual output is:
takes int
takes Long
takes Short
However if I have the following three functions:
public static void go(Integer n) {System.out.println("takes Integer");}
public static void go(Long n) {System.out.println("takes Long ");}
public static void go(Short n) {System.out.println("takes Short ");}
... and call it using:
int a= 10; and go(i); //output : takes Integer.
... why there is there a difference for short
and int
?
See JLS Section 15.12.2, for rules compiler follows to determine which method to invoke. Compiler always chooses the most specific method in case your methods are overloaded:
There may be more than one such method, in which case the most specific one is chosen. The descriptor (signature plus return type) of the most specific method is one used at run time to perform the method dispatch.
Compiler first tries to resolve the method without boxing or unboxing as quoted there:
The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.
Emphasis mine.
So, in your 1st code, since short can be used as argument for parameter of type int. Compiler will not use the method with parameter Short
, as that requires boxing. While in case of long type, since it cannot be used as argument for type int, it goes for boxing it to Long
. Remember Widening is preferred over Boxing.
In your 2nd, there is no other way than boxing int
to Integer
. So, it calls method with Integer
parameter.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With