Converter tipo primitivo em object

[color=blue] [/color] :?
galera to com algumas duvidas levantadas pelo meu professor:

1)pq a jvm converte tipo primitivo em object, pq da conversão?

2)quais são as vantagen e desvantagens dessa conversão?

  1. existe outra maneira de converter tipo primitivo em object além de casting???

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:

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

  1. 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();

AMIGO, TO COMEÇANDO AGORA COM JAVA
POR ISSO COLOQUEI O TOPICO EM JAVA BASICO

ENTENDI POUCO DE SUA RESPOSTA

VC PODERIA ME PASSAR SUA EXPLICAÇÃO NUM NIVEL MAIS BAIXO?
PLEASE

A resposta 1 depende do contexto: muitas operações só podem acontecer entre Objetos, logo se vc tem um primitivo ali no meio a jvm tem que converter.

A resposta 2 depende de conhecer a diferença entre == e o método equals, entre outras coisas.

A resposta 3 depende da versão do java.

$ cat A.java
class A{
static{
Double d = (Double) 10.0;
System.exit(0);
}
}

$ javac -source 1.4 A.java # nao funciona!
A.java:3: inconvertible types
found : double
required: java.lang.Double
Double d = (Double) 10.0;
^
1 error

$ javac -source 1.5 A.java # aqui funciona!