Boxing automático, ou Cast Implicito?

8 respostas
xdraculax

Pessoal, porque o código a seguir dá erro:

Long somatorio = 0;
//Que dé erro: Type mismatch: cannot convert from int to Long

Tudo bem que se eu adicionar L ao zero, o código funciona. Mas, o mais interessante é que o seguinte código, funciona:

long somatorio = 0;

Alguém pode me explicar o porque disso?
Já que um int é perfeitamente “cabível” em um long ou Long??

8 Respostas

evertonsilvagomesjav

Nao tem como vc ampliar e fazer boxing, tem como vc fazer boxing e depois ampliar.

charlesbraw
1. Long somatorio = 0;  
   2. //Que  erro: Type mismatch: cannot convert from int to Long

Isso acontece porque é feito um box automático, 0 é convertido para um tipo Integer que por sua vez não possui relacionamento com Long

Isso acontece também se você fizer isso:

Long l = new Integer(4); Integer i = (char)2;

Você só pode fazer boxing para tipos compativeis e não ampliação como é feito com primitivos.

Nesse caso é valido:

Long l = new Long(2);

O construtor de Long espera um primito long(primitivo), logo um int cabe em um long (que não é Long)

1. long somatorio = 0;

Isso funciona pois não acontece um boxing, estamos trabalhando com ampliação de primitivos.

xdraculax

É verdade…

Então o boxing automático é feito sempre que é tentado atribuir um tipo primitivo à um tipo wrapper, mesmo que não seja passando o primitivo como parâmetro para um método.

F

Isso td é pq as classes Wrapper numéricas herdam do tipo Number, por isso não passam no teste É-UM entre elas, mas somente com a classe Number.

Integer É-UM Number -> ok
Long É-UM Number -> ok
Integer É-UM Long -> erro…

D

Porque isso funciona?

Integer i = (char)2;

char fazendo autoboxing pra Integer nao era pra dar pau?

xdraculax

Nesse caso, você está forçando com o cast, então o compilador “tá nem vendo”.

D

han? nao entendi não.

xdraculax

Ele aceita porque um char é um inteiro de 8bits no final das contas, portanto, aceitável para um integer com 32 bits.

Criado 20 de outubro de 2010
Ultima resposta 21 de out. de 2010
Respostas 8
Participantes 5