qual a diferença em fazer um cast e um Wrapper?
int j =4; String teste="123";
Integer i = new Integer(teste); Integer b = (Integer) j;
qual a diferença em fazer um cast e um Wrapper?
int j =4; String teste="123";
Integer i = new Integer(teste); Integer b = (Integer) j;
Fala Dayson, tudo bem ?
A ideia de um Wrapper em si é simplesmente servir como um embrulho (como o próprio nome diz - wrap) principalmente para os tipos primitivos - mas não somente eles.
Por meio deles é possível, por exemplo, guardar um valor de um determinado tipo primitivo em um tipo referência equivalente.
int i = 4;
Integer j = new Integer(i);
Aqui temos o mesmo valor inteiro acessível das duas formas . A principal diferença fica por conta da forma como a linguagem vai armazenar as informações. O primitivo tem seus bytes armazenados diretamente na área de variáveis sendo acessível diretamente, já no outro caso é criado um objeto na memória de objetos (Heap) - que é gerenciada pelo coletor de lixo - sendo acessível por meio de uma referência armazenada na área de variáveis.
Como o Wrapper em si é uma classe, podemos contar com uma série de recursos adicionais, como construtores que possibilitam criar inteiros recebendo dados em outros formatos, como texto, por exemplo - Integer x = new Integer("5");
O processo de cast não tem nenhuma relação com os Wrappers. Ele serve para copiar valores ou referências para outras variáveis de tipos distintos.
Exemplo:
/*
aqui existe um cast
estamos copiando o valor de um int para uma variável long
porém como nessa copia não existe nenhum risco, já que é possível representar todo inteiro como long, ele é implicito
*/
int i = 3;
long l = i;
/*
Aqui necessitamos explicitar usando um "molde" (cast), para que o código compile
Já que existe o risco de perda de informação, pois nem todo long (8 bytes), pode ser representado como um int (4 bytes)
*/
long l = 3;
int i = (int) l; //risco de perda de informação
/*
Aqui existe cast, já que estamos copiando a referência de um objeto do tipo String, para uma referência do tipo Object
Como não há risco para a jvm, como toda String é um Object (toda classe é filha de Object), o cast é implicito
*/
String string = "exemplo";
Object obj = string;
/*
Porém se fizermos isso. Temos que explicitar o cast pra poder compilar, já que não há garantias ao compilador que todo objeto é uma String.
*/
String outraVariavel = (String) obj; // risco de ClassCastException
Dê uma olhada no material dos cursos da Caelum: Casting, Casting de Referências, Wrappers
Espero ter ajudado. Abraço!
valeu pela ajuda