Is this really widening vs autoboxing? | I saw this in [an answer to another question](https://stackoverflow.com/a/4384/697449), in reference to shortcomings of the Java spec:



> 
> There are more shortcomings and this is a subtle topic. Check [this](http://kiranthakkar.blogspot.com/2007/05/method-overloading-with-new-features-of.html) 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...