Converter tipo primitivo em object

3 respostas
E

[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???

3 Respostas

ViniGodoy
ediel_xadrez:
pq a jvm converte tipo primitivo em object, pq da conversão?
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.
2)quais são as vantagens e desvantagens dessa conversão?
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:

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)
        }
     }

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.

3) 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();
E

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

peczenyj

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!

Criado 2 de agosto de 2008
Ultima resposta 3 de ago. de 2008
Respostas 3
Participantes 3