WIDENING BOXING AND VARARGS 7 RULES
1. Primitive Widening > Boxing > Varargs.
2. Widening and Boxing (WB) not allowed.
3. Boxing and Widening (BW) allowed.
4. While overloading Widening + vararg and boxing + vararg are mutually exclusive of each other.
5. Widening between wrapper classes not allowed
6. Widening+varArgs & Boxing+varargs are individually allowed (but not allowed in overloaded version of method)
7. Boxing+Widening is preferred over Boxing+Varargs.
foo(5);
foo(Integer i) and foo(long l) // long (by Rule 1)
//Explanation:
//int to Integer — boxing
//int to long — widening
// Rule 1: widening > boxing
foo(int…i) and foo(Integer i) // Integer (by Rule 1)
//Explanation:
//int to int… — varargs
//int to Integer — boxing
// Rule 1: boxing > varargs
foo(long…l) and foo(Integer i) // Integer (Rule 1)
//Explanation:
//int to long… — varargs
//int to Integer — boxing
// Rule 1: boxing > varargs
foo(Object o) and foo(int…i) // Object o (Rule 1)
//Explanation:
//int to int… — varargs
//int to Object — boxing
// Rule 1: boxing > varargs
foo(Object o) and foo(long l) // long l (Rule 1)
//Explanation:
//int to long — widening
//int to Object — boxing
// Rule 1: widening > boxing
foo(Object o) and foo(Integer… l) // Object o (Rule 1)
//Explanation:
//int to Integer… — boxing + varargs
//int to Object — boxing
// Rule 1: boxing > varargs
foo(Long l) and foo(int…i) // int…i (Rule 2 )
//Explanation:
//int to Long — widening (to long) + boxing (to Long)
//int to int… — varargs
// Rule 2: widening + boxing is not allowed
foo(Long l) and foo(Integer…i) // Integer…i(Rule 2)
//Explanation:
//int to Long — widening (to long) + boxing (to Long)
//int to Integer… — boxing + varargs
// Rule 2: widening + boxing is not allowed
foo(Object o) and foo(Long l) // Object o (Rule 2)
//Explanation:
//int to Long — widening (to long) + boxing (to Long)
//int to Object — boxing
// Rule 2: widening + boxing is not allowed
foo(long…l) and foo(Integer…i) // ambiguous (Rule 4)
//Explanation:
//int to long… — widening + varargs
//int to Integer… — boxing + varargs
// Rule 4: widening + vararg and boxing + vararg are mutually exclusive of each other.