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.
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…