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.
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 é utilizarShort.valueOf(“1”). Mas queria algo mais direto, como fazemos com int e String.
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).
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.
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;
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.
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;
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:
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:
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)
Agora entendi!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: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)
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...
:)