Autoboxing

Alguém poderia me explicar por que o autoboxing não funciona abaixo?

ArrayList a=new ArrayList();
a.add(1);

Requer casting. Achava que o autoboxing faria isso por mim já que usei o Generics.

1 é um int, não um short. Você precisaria usar uma constante short, ou seja:

a.add((short)1); 

Então é só via casting? Não tem nenhuma solução para este caso, pois achava que o Autoboxing faria o cast necessário.
Outra alternatiba, sem casting é utilizar Short.valueOf(“1”). Mas queria algo mais direto, como fazemos com int e String.

[quote=luciusfox]Então é só via casting? Não tem nenhuma solução para este caso, pois achava que o Autoboxing faria o cast necessário.
Outra alternatiba, sem casting é utilizar Short.valueOf(“1”). Mas queria algo mais direto, como fazemos com int e String.[/quote]
Isso é algo que já existia antes do Autoboxing.

Você não pode fazer implicitamente uma conversão que corre o risco de perda de precisão.int i = 1; short s = i;Isso não funciona. Se existe uma possível perda de precisão, você tem que declarar explicitamente (via cast) que quer que seja feita a conversão mesmo assim.

Sim, isso eu entendendo devido ao tamanho dos tipos e do conceito de casting implícito (sem perda) e explícito (com perda).
Achei que houvesse alguma maneira de representar o número short sem fazer o casting ou usar o wrapper (Short).

[quote=luciusfox]Alguém poderia me explicar por que o autoboxing não funciona abaixo?

ArrayList a=new ArrayList();
a.add(1);

Requer casting. Achava que o autoboxing faria isso por mim já que usei o Generics.[/quote]

O estranho é que a conversão abaixo funciona, mesmo 10000 sendo uma literal int.

Short testeAutoboxing = 10000;
System.out.println(testeAutoboxing.getClass().getName());

Já isto, não funciona. Bem… coisa do Java.

Integer inteiro = 50L;

[quote=bombbr][quote=luciusfox]Alguém poderia me explicar por que o autoboxing não funciona abaixo?

ArrayList a=new ArrayList();
a.add(1);

Requer casting. Achava que o autoboxing faria isso por mim já que usei o Generics.[/quote]

O estranho é que a conversão abaixo funciona, mesmo 10000 sendo uma literal int.

Short testeAutoboxing = 10000;
System.out.println(testeAutoboxing.getClass().getName());

Já isto, não funciona. Bem… coisa do Java.

Integer inteiro = 50L; [/quote]

O que você quis fazer nesse caso?

O primeiro exemplo que vc deu não faz nenhuma conversão, e o segundo não é permitido fazer…

Não entendi…

:roll:

[quote]
O que você quis fazer nesse caso?
O primeiro exemplo que vc deu não faz nenhuma conversão, e o segundo não é permitido fazer…
Não entendi…
:roll:[/quote]

O que eu coloquei no exemplo acima é apenas para mostrar o comportamento do compilador Java, onde:

ArrayList<Short> a=new ArrayList<Short>();
a.add(1000);                                                //Erro, não faz o autoboxing.

Short testeAutoboxing = 10000;         // OK, converte 10000 (literal tipo int) para um Short, ou seja, faz o autoboxing

Integer inteiro = 50L;            //ERRO, não faz o autoboxing do valor 50L (literal tipo long)

[quote=bombbr][quote]
O que você quis fazer nesse caso?
O primeiro exemplo que vc deu não faz nenhuma conversão, e o segundo não é permitido fazer…
Não entendi…
:roll:[/quote]

O que eu coloquei no exemplo acima é apenas para mostrar o comportamento do compilador Java, onde:

[code]
ArrayList a=new ArrayList();
a.add(1000); //Erro, não faz o autoboxing.

Short testeAutoboxing = 10000; // OK, converte 10000 (literal tipo int) para um Short, ou seja, faz o autoboxing

Integer inteiro = 50L; //ERRO, não faz o autoboxing do valor 50L (literal tipo long)

[/code][/quote]
Agora entendi!

Mas concordo com o comportamento do compilador nestes casos. Ele se comporta deste modo nesse caso do ArrayList com generic para evitar que justamente seja passado um valor que não é compatível com Short, caso contrário terá que fazer o cast.

Por exemplo: 10000 pode ser Short, Long, double, Double, int e Integer. Se você passar como argumento para o método add() uma variável já declarada, ele só vai aceitar se ela foi declarada como Short.

Agora, você passando o o valor literal como parâmetro, quem garante que a intenção foi passar um Short mesmo? É uma coisa meio besta isso que estou falando, mas em resumo, o compilador assume as mesmas regras tanto pra variáveis no argumento como pra valores literais…

É chato, mas evita erros posteriores…

:slight_smile: