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:
Longl=newLong(2);
O construtor de Long espera um primito long(primitivo), logo um int cabe em um long (que não é Long)
1.longsomatorio=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
felipe.sales
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
Dota
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
Dota
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.