Dúvida sobre duas questões do Test Killer - Wrapper classes  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
leonardo.moreti
Entusiasta Java

Membro desde: 30/10/2009 08:22:49
Mensagens: 18
Localização: Sorocaba/SP
Offline

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


Question 93
Given:

11. public class Yikes {
12.
13. public static void go(Long n) {System.out.println("Long ");}
14. public static void go(Short n) {System.out.println("Short ");}
15. public static void go(int n) {System.out.println("int ");}
16. public static void main(String [] args) {
17. short y= 6;
18. long z= 7;
19. go(y);
20. go(z);
21. }
22. }

What is the result?

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

Answer: A


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?

ivandasilva
JavaEvangelist
[Avatar]

Membro desde: 03/11/2007 11:48:58
Mensagens: 309
Offline

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).

O sol nasce, a bicicleta anda, o lobo uiva e o urso panda.
[WWW] [MSN]
kaduzick
Thread.start()

Membro desde: 17/11/2009 21:50:19
Mensagens: 26
Offline

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.
leolimas
JavaTeenager

Membro desde: 07/12/2008 09:36:41
Mensagens: 165
Offline

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.

Leonardo Lima - Programador Web

Desenvolvimento Web Rio Preto - Leonardo Lima - Programador Web

São José do Rio Preto
[WWW]
evertonsilvagomesjava
GUJ Master
[Avatar]

Membro desde: 23/08/2009 13:14:01
Mensagens: 1924
Online

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.

This message was edited 1 time. Last update was at 03/12/2009 12:02:39

ivandasilva
JavaEvangelist
[Avatar]

Membro desde: 03/11/2007 11:48:58
Mensagens: 309
Offline

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

This message was edited 1 time. Last update was at 04/12/2009 08:37:07


O sol nasce, a bicicleta anda, o lobo uiva e o urso panda.
[WWW] [MSN]
leolimas
JavaTeenager

Membro desde: 07/12/2008 09:36:41
Mensagens: 165
Offline

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..

Leonardo Lima - Programador Web

Desenvolvimento Web Rio Preto - Leonardo Lima - Programador Web

São José do Rio Preto
[WWW]
tinorberto
JavaEvangelist
[Avatar]

Membro desde: 29/10/2008 15:54:46
Mensagens: 344
Localização: Viçosa - Minas Gerais
Offline

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

Bacharel - Ciência da Computação
Universidade Federal de Viçosa
OCJP 6
[Email] [MSN]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team