Porque as classes de coleções, o comando System.out.printf, várias classes do swing (models e componentes), entre outras coisas, só podem trabalhar com objects.
Então essa era uma operação muitíssimo comum.
As principais vantagens são:
- Redução da sintaxe (boilerplate). Sem autoboxing, você teria que usar a lista assim:
List<Integer> umaLista = new ArrayList<Integer>();
umaLista.add(Integer.valueOf(1));
umaLista.add(Integer.valueOf(2));
umaLista.add(Integer.valueOf(3));
System.out.printf("O valor é: %d", umaLista.get(1).intValue());
A desvantagem é que fica menos óbvio que tipo de conversão o java estará fazendo. Vamos pegar um exemplo particularmente ruim (retirado do artigo: http://java.sun.com/developer/JDCTechTips/2005/tt0405.html), o equals. Considere a classe:
[code] import java.util.ArrayList;
public class BoxingEquality {
public static void main(String[] args) {
int i = 2;
int j = 2;
ArrayList <Integer> list = new ArrayList<Integer>();
list.add(i);
list.add(j);
System.out.printf("It is %b that i ==j.\n",
(i==j)); //(1)
System.out.printf("It is %b that " +
"list.get(0) == list.get(1).\n",
list.get(0)==list.get(1)); //(2)
System.out.printf("It is %b that " +
"list.get(0).equals(list.get(1)).",
list.get(0).equals(list.get(1))); //(3)
}
}
[/code]
A operação (1) compara dois tipos primitivos.
A operação (2) compara dois números criados por autoboxing, usando ==
A operação (3) compara dois números criados por autoboxing, usando equals.
O resultado de executar esse comando é:
It is true that i ==j.
It is true that list.get(0) == list.get(1).
It is true that list.get(0).equals(list.get(1)).
Entretanto, se você alterar o valor de i e j para 2000, o resultado se torna:
It is true that i ==j.
It is false that list.get(0) == list.get(1).
It is true that list.get(0).equals(list.get(1)).
Isso porque a comparação de objetos com == só retorna true quando os dois objetos ocupam a mesma posição de memória. É o caso para todos os objetos criados por autoboxing e menores que 255, mas não é o caso do 2000, mostrado no exemplo. Via de regra, o ideal é tratar as listas sempre como se tivessem objetos dentro, a menos que vc tenha absoluta certeza de que a conversão será correta.
Outro problema é que, como ressaltado pela próprio sun nesse artigo, as conversões automáticas não são as de melhor performance. Então, evite usar auto-boxing sempre que você estiver dentro de um loop.
- existe outra maneira de converter tipo primitivo em object além de casting???
Sim, usando o construtor, o método value of das classes Wrapper e os métodos para obtenção dos tipos primitivos.
Integer xObj = Integer.valueOf(10);
Double yObj = new Double(14.5);
int xPrim = xObj.intValue();
double yPrim = yOBj.doubleValue();