Is this really widening vs autoboxing? *

Question

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 choses >widening over autoboxing. Be careful when using autoboxing 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...

Answer

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.

< br > via < a class="StackLink" href=" http://stackoverflow.com/questions/4922/" >Is this really widening vs autoboxing?< /a>
Share on Google Plus

About Cinema Guy

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 comments:

Post a Comment