I am preparing for a SCJP exam and when studying widening part it's given that widening beats both Boxing and Var-args in overloading but there is no clear explanation. Tried searching but didnt get any better answer.
One answer i got is because the compiler chooses the older style before it chooses the newer style. But I am not convinced.
Edit: I know widening is preferrd than boxing and var-args. but WHY is my question. of which i know one. any other reasons.
Yes, the compiler "chooses the older style over the newer style", because of compatibility requirements. Imagine some code, written before Java 5 came out, that suddenly had a change of behaviour when compiled under Java 5! That would be bad.
Widening conversions have been around since the dawn of Java, but autoboxing and varargs are new to Java 5.
The compiler has to keep compatibility with previous versions of Java. On top of that the compiler chooses the most performant / smallest change to the argument. Promoting to another primitive beats creating wrapper object and that beats creating an array with regards to memory usage and performance.
widening beats boxing, boxing beats generics, generics beat varargs
to solve above mind this:
widening beats boxing, boxing beats varargs
the out put will be Converted to long:3
I don't know about you, but I'd much rather that the compiler passed my
byte
as anint
than as aByte
. Consider the overhead. And varargs also requires boxing.In other words, the reason is efficiency. The language design prefers the more efficient calling mechanism that does not require it to allocated a boxed item.
'Requires', you ask? The varargs functions expect to get an array of
Object
, and that can't include a primitive type.Compatibility is not a bad reason, either.
The reason that widening performs better is because it is a simple operation to sign extend, a single instruction for most CPUs. Boxing requires a heap allocation, and boxed objects are more expensive to access, requiring at least an additional memory access.
Even without the compatibility issue, it seems to me that you'd want the language to prefer the fastest overload first, as long as this behavior doesn't create any worse issues.