Dúvida sobre duas questões do Test Killer - Wrapper classes

Oi pessoal, não consigo entender um negócio. Veja:

[b]
Question 93
Given:

  1. public class Yikes {
  2. public static void go(Long n) {System.out.println("Long ");}
  3. public static void go(Short n) {System.out.println("Short ");}
  4. public static void go(int n) {System.out.println("int ");}
  5. public static void main(String [] args) {
  6. short y= 6;
  7. long z= 7;
  8. go(y);
  9. go(z);
  10. }
  11. }

What is the result?

A. int Long
B. Short Long
C. Compilation fails.
D. An exception is thrown at runtime.

Answer: A
[/b]

Meu raciocínio:

go(y) - A JVM vê que y é um tipo short, e portanto tenta procurar um método go que receba um short como argumento. Ok, ela não encontra, mas encontra um go que recebe um Short (classe Wrapper) e consegue fazer um autoboxing.

go(z) - A JVM vê que z é um long, e portanto tenta procurar um método go que receba um long. Não encontra. Mas encontra um go que recebe um Long, e faz um autoboxing para Long. Ok.

Eu errei, pois segui meu raciocínio e marquei B. Por que a resposta é A?

Nestas questões siga sempre a evolução do Java…

1 - casting (isto porque um short cabe em um int, porque se fosse ao contrário ocorreria um ClassCastException);
2 - wrappers;
3 - var-args(que não vem ao caso, nesta questão).

Isso mesmo. Em outras palavras, a JVM prefere coisas que funcionariam em versões anteriores antes de escolher coisas que funcionariam na versão mais nova.
Para este caso específico a JVM prefere fazer a promoção de short para int do que o autoboxing de short para Short.

Acredito que seja essa sequencia, pelo que eu pude entender e pelo que o pessoal comentou…

1º Se é um tipo primitivo, então a JVM irá procurar um método que recebe um primitivo que o valor “caiba” ou seja short cabe no int
2º Não achou nenhum método que recebe primitivo, então começa a procurar pelas classes wrappers, ai também procura o que cabe, no caso não há nenhum método que receba long (tipo primitivo), long não cabe no int, long não sabe no Short, então só restou o Long.

leolimas não e bem por ai, um long teoricamente caberia em um Double warraper correto? Mas na pratica da erro de compilação se vc tentar atribuir um long primitivo em um Double wrapper.

No caso da pergunta o double quanto o long possuem 8 bytes no outro caso o int possui 4 bytes.

Tem razão Everton!

Tinha deixado de passar este detalhe, só não consegui bolar um texto para explicar certinho, mas fiz uns testes aqui…

Fiz um código de teste aqui, e realmente não deixa compilar, uma classe Wrapper só aceita primitivo (literal também) do mesmo tipo da classe Wrapper.
Montei método com overload para todos os primitivos e classes Wrapper, quando passei os valores para ele, foi dado preferencia primeiro para os métodos que recebiam métodos primitivos
ai sim ele fez o casting do tipo que cabe, ai quando não teve mais nenhum primitivo que ele procurou pelo método com a classe Wrapper

Vlw…

Neste topico tem o mesmo assunto. http://www.guj.com.br/posts/list/145152.java#783814
Tem muitas explicações lá sobre o assunto. Flw