Let’s say we have an overloaded function called fun():
void fun(string) { system.out.println("String"); }void fun(int) { system.out.println("Int"); }void fun(double) { system.out.println("Double"); }void fun(float) { system.out.println("float"); }
If we call fun(37) how does the system choose which function toexecute? Basically it chooses based on type conversions.The parameter 37 is an [int]eger and may be converted to a [double] or[float] by “widening”, but cannot be converted to a [string], sofun(string) is not executed.
Choosing between the last 3 is a bit more tricky: The system willchoose the type which can be most easily converted into the other two(i.e: via widening). An [int] can be widened into both [float] and[double]; A [double] can be widened into a [float] but cannot beconverted to an [int]; A [float] cannot be converted to either. Thusfun(int) will be chosen.
Basically, any invocation of fun(int); can be handled by bothfun(double); and fun(float);
Take another example:void fun(int, double) { }void fun(double, int) { }
And fun(1,2); is called. The system will drop an ambiguity error,since it won’t know what to do here.
Understanding this mechanism is all well and fine, but it is notadvisable to overload a function with types like [int] and [double]since it starts getting tricky and logical errors may start coming in.