--nãocompilasituação1publicclassWindenBox{staticvoidgo(Longx){System.out.println("Long");}publicstaticvoidmain(String[]args){intb=5;go(b);//precisa ampliar para depois fazer o boxing NAO É VALIDO isso//é muita coisa para o compilador.}}
e essa situação :
--compilasituação2publicclassWindenBox{staticvoidgo(Longx){System.out.println("Long");}publicstaticvoidmain(String[]args){longb=5;go(b);//precisa ampliar para depois fazer o boxing NAO É VALIDO isso//é muita coisa para o compilador.}}
É que o autoboxing nao funciona para tipos diferentes.
Situacoes:
intparaLong-naofunfaintparalong-funfa
Acho q é isso.
Flw
bruno.leite
--nãocompilasituação1publicclassWindenBox{staticvoidgo(Longx){System.out.println("Long");}publicstaticvoidmain(String[]args){intb=5;go(b);//precisa ampliar para depois fazer o boxing NAO É VALIDO isso //é muita coisa para o compilador. }}
Esse caso não compila porque o compilador deve fazer a ampliação (de int para long) e após fazer o boxing, o compilador só realiza boxing de tipos iguais, por exemplo ‘int para Integer’, ‘short para Short’ e etc…
--compilasituação2publicclassWindenBox{staticvoidgo(Longx){System.out.println("Long");}publicstaticvoidmain(String[]args){longb=5;go(b);//precisa ampliar para depois fazer o boxing NAO É VALIDO isso //é muita coisa para o compilador. }}
esse caso compila porque ele deve somente realizar o boxing, pois os tipos são iguais
--nãocompilasituação3publicclassWindenBox{staticvoidgo(Longx){System.out.println("Long");}publicstaticvoidmain(String[]args){Integerb=5;go(b);//Não existe ampliação de tipos wrappers
Não existe ampliação de tipos wrappers, ou seja, ele não transforma (Short em Integer) e assim por diante, pois Short não é subclasse de Integer.
andrepestana
Paribe,
a resposta está escrita na própria pergunta:
Sempre que for preciso ampliar (no caso de int para long) para depois fazer o autoboxing (no caso para Long) não irá compilar.
Agora, se for preciso fazer apenas o autoboxing, a classe compila e funciona perfeitamente. (long -> Long =autoboxing)
abraço,
W
WillyKocher
cara é simples… lance de ampliacao do existe para primitivos.
e o boxing do primitivo so acontece para seu Wrapper correspondente… uma classe wrapper nunca e compativel com outra, o porque disso é que nenhuma das classes wrapper extende a outra, é so pensar nas classes Wrapper como um objeto comum, verifica a hierarquia do Objeto e vê se eles tem alguma superclasse em comum.
ele aceitaria porque todos os wrappers extendem Number, e se fosse Object tambem funcionaria… manjou ?
W
WillyKocher
agora não se esquece que quando um primitivo e ampliado para outro impritivo… tipo
um int virou um long…
vc pode usar a nova referencia desse long e invocar um metodo que espere um Long…
Lembre-se que o Java nunca destroirá seus dados. Ou seja, ele é type-safe.
As regras de type-safety aplicam-se mesmo quando é o java fazendo as coisas difíceis.
Se vc tentar passar um int para um Long não funciona porque isso significaria
Passar int para Integer
Passar Integer onde Long é esperado
é auto-boxing e funciona, mas 2) não é type-safe. É como passar Integer onde String é esperado.
Não ha promoção automática de classes e por isso não funciona. Promoção só de primitivos (int -> long)