what is so confusing about it.
1.Remember one rule Array is an Object in Java(everything is an object).
2.widening bit boxing, and boxing bit vararg. So in general vararg is last option when no other option is present for compiler.
3.You can never widen and then box because of this IS-A
test fail, But you can box and then widen it.
here in this example you have created 2 array as
Now it checks for method which takes array as an argument but for array of A it doesn't found it. so it use method which takes Object and hence execute method. (Here widening bit boxing and vararg)
If this method is not exist then it execute
In second method for sifter(ba) it found method as
so print as 3
In last method there is no matching parameter for int so it execute