Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this really widening vs autoboxing?

I saw this in an answer to another question, in reference to shortcomings of the Java spec:

There are more shortcomings and this is a subtle topic. Check this out:

public class methodOverloading{      public static void hello(Integer x){           System.out.println("Integer");      }       public static void hello(long x){           System.out.println("long");      }       public static void main(String[] args){          int i = 5;          hello(i);      } } 

Here "long" would be printed (haven't checked it myself), because the compiler chooses widening over auto-boxing. Be careful when using auto-boxing or don't use it at all!

Are we sure that this is actually an example of widening instead of autoboxing, or is it something else entirely?

On my initial scanning, I would agree with the statement that the output would be "long" on the basis of i being declared as a primitive and not an object. However, if you changed

hello(long x) 

to

hello(Long x) 

the output would print "Integer"

What's really going on here? I know nothing about the compilers/bytecode interpreters for java...

like image 499
Andy Avatar asked Aug 07 '08 16:08

Andy


People also ask

What is the difference between auto widening auto up casting and Autoboxing?

Auto-widening occurs when small sized primitive type is casted to big sized primitive type. Auto-upcasting occurs when sub class type is casted to super class type. Auto-boxing occurs when primitive type is casted to corresponding wrapper class.

What do you mean by Autoboxing?

Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. For example, converting an int to an Integer, a double to a Double, and so on. If the conversion goes the other way, this is called unboxing.

What is the difference between boxing and Autoboxing?

Boxing is the mechanism (ie, from int to Integer ); autoboxing is the feature of the compiler by which it generates boxing code for you.

What is the major advantage of Autoboxing?

Autoboxing and unboxing lets developers write cleaner code, making it easier to read. The technique lets us use primitive types and Wrapper class objects interchangeably and we do not need to perform any typecasting explicitly.


2 Answers

In the first case, you have a widening conversion happening. This can be see when runinng the "javap" utility program (included w/ the JDK), on the compiled class:

public static void main(java.lang.String[]);   Code:    0:   iconst_ 5    1:   istore_ 1    2:   iload_ 1    3:   i2l    4:   invokestatic    #6; //Method hello:(J)V    7:   return  } 

Clearly, you see the I2L, which is the mnemonic for the widening Integer-To-Long bytecode instruction. See reference here.

And in the other case, replacing the "long x" with the object "Long x" signature, you'll have this code in the main method:

public static void main(java.lang.String[]);   Code:    0:   iconst_ 5    1:   istore_ 1    2:   iload_ 1    3:   invokestatic    #6; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;    6:   invokestatic    #7; //Method hello:(Ljava/lang/Integer;)V    9:   return  } 

So you see the compiler has created the instruction Integer.valueOf(int), to box the primitive inside the wrapper.

like image 93
Camilo Díaz Repka Avatar answered Sep 17 '22 20:09

Camilo Díaz Repka


Yes it is, try it out in a test. You will see "long" printed. It is widening because Java will choose to widen the int into a long before it chooses to autobox it to an Integer, so the hello(long) method is chosen to be called.

Edit: the original post being referenced.

Further Edit: The reason the second option would print Integer is because there is no "widening" into a larger primitive as an option, so it MUST box it up, thus Integer is the only option. Furthermore, java will only autobox to the original type, so it would give a compiler error if you leave the hello(Long) and removed hello(Integer).

like image 27
Mike Stone Avatar answered Sep 17 '22 20:09

Mike Stone