You can either
Widenor
Boxbut you cannot do both, unless you are
boxingand wideningto
Object(An int to Integer(Boxing) and then Integer to
Object(Widening) is legal, since every class is a subclass of
Object, so it
is possible for
Integerto be passed to
Objectparameter)
Similarly an
intto
Numberis also legal (int -> Integer -> Number) Since
Number is the super class of
Integerit is possible.
Let’s see this in your example: -
public static void test(Integer...i)public static void test(Float...f)
There are some rules that are followed when selecting which overloaded method
to select, when Boxing, Widening, and Var-args are combined: -
- Primitive widening uses the
smallest
method argument possible - Wrapper type cannot be widened to another Wrapper type
- You can Box from int to Integer and widen to Object but no to Long
- Widening beats Boxing, Boxing beats Var-args.
- You can Box and then Widen (An
int
can becomeObject
viaInteger
) - You cannot Widen and then Box (An
int
cannot becomeLong
) - You cannot combine var-args, with either widening or boxing
So, based on the above given rules: -
When you pass two integers to above functions,
- according to rule 3, it will have to be first
Widened
and thenBoxed
to fit into aLong
, which is illegal according to rule 5 (You cannot Widen and then Box). - So, it is Boxed to store in
Integer
var-args.
But in first case, where you have methods with var-args
of primitive types:
public static void test(int...i)public static void test(float...f)
Then
test(1, 2)can invoke both the methods (Since neither of them is more
suitable for
rule 1to apply) : -
- In first case it will be
var-args
- In second case, it will be Widening and then Var-args (which is allowed)
Now, when you have methods with exactly one int and one flost: -
public static void test(int i)public static void test(float f)
Then on invoking using
test(1), rule 1 is followed, and smallest possible
widening (i.e. the
intwhere no widening is needed at all) is chosen. So 1st
method will be invoked.
For more information, you can refer to
JLS - Method InvocationConversion



