| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/12/2009 16:30:16
|
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?
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/12/2009 17:27:05
|
ivandasilva
JavaEvangelist
![[Avatar]](/images/avatar/f0c19e4e1cbcc224b862bb4579a06a7e.jpg)
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.  |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/12/2009 09:26:39
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/12/2009 10:20:55
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/12/2009 11:49:07
|
evertonsilvagomesjava
GUJ Master
![[Avatar]](/images/avatar/6370988b46be58caec00d925d91d2f99.png)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/12/2009 08:36:42
|
ivandasilva
JavaEvangelist
![[Avatar]](/images/avatar/f0c19e4e1cbcc224b862bb4579a06a7e.jpg)
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.  |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/12/2009 08:57:22
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/12/2009 11:04:08
|
tinorberto
JavaEvangelist
![[Avatar]](/images/avatar/906b92b2e09a38a0dc5933b4943e87a0.jpg)
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 |
|
|
 |
|
|