Pergunta

Esta questão é sobre "Por que autoboxing fazer algumas chamadas ambígua em Java? "

Mas a leitura através das respostas, há uma série de referências a fundição e eu não estou certo que eu entendo completamente a diferença.

Alguém pode fornecer uma explicação simples?

Foi útil?

Solução

O boxe é quando você converte um tipo primitivo de um tipo de referência, un-boxing é o inverso. Fundição é quando você quer um tipo de ser tratado como um outro tipo, entre tipos primitivos e tipos de referência, isto significa uma operação implícita ou explícita de boxe. Se ele precisa ser explícita é um recurso de linguagem.

Outras dicas

Ambos fundição e boxe / unboxing tem a ver com os tipos e conversão aparente (ou real), mas o boxe / unboxing é específico para a relação entre tipos primitivos e seus correspondentes invólucro tipos, enquanto fundição é o termo para a mudança explícita ou implícita do tipo, no sentido mais geral.

Fundição é um termo geral com dois significados relacionados-mas-diferentes:

  1. Tratar um valor de um tipo como se se fosse um valor de outro tipo. Dois exemplos deste primeiro usos são:

    1.1. Dado que a classe B estende a classe A, você pode pedir para myB uma instância de B ser tratado como uma instância de A escrevendo ((A) myB) sempre que uma referência a uma instância de A poderia aparecer. Este não realmente produzir uma nova instância do A.

    1.2. coleções pré-java5 armazenados todos os conteúdos como Object; este geralmente necessária a utilização de um elenco depois de recuperar um objeto de uma coleção. Por exemplo, se você tinha armazenado um String em um Map e necessário para obter a sua extensão, você escreveria algo como ((String) myMap.get(someKey)).length() onde o elenco seria necessária, a fim de chamar o método length de String. Mais uma vez, isso não causa um novo String a ser criado.

  2. Explicitamente convertendo um tipo para outro (isto é, mudando a representação explicitamente). Um exemplo deste segundo uso é na ((int) (float_var + 0.5F)) expressão que arredonda uma variável de ponto flutuante por adição de 0,5 (que produz um valor de ponto flutuante) e, em seguida, convertendo explicitamente que o valor para um número inteiro. O valor inteiro resultante (depois do fundido (int)) é produzida do outro valor por computação interna.

processo de fundição pode ser feito quando há uma relação superclasse / subclasse ou interface / implementador (que significa um acima) ou quando os dois tipos são primitivo tipos numéricos (ou seja, 2). Você pode olhar para cima "ampliação" e "estreitar" para mais detalhes.

encaixotamento refere-se a envolver tipos primitivos em objectos de contentores, geralmente feito apenas quando é necessário ter um objecto (por exemplo, o armazenamento de um valor de um conjunto). Os tipos primitivos e de mensagens publicitárias vêm em pares:

int      Integer
long     Long
boolean  Boolean
...      ...

Unboxing significa simplesmente recuperando o valor primitivo de dentro seu invólucro objeto.

Como de Java5, quando você escrever uma expressão que usa um valor primitivo, onde seria necessário o tipo de embalagem correspondente (como colocar um inteiro em uma coleção), o compilador desliza automagicamente no código que realmente envolve esse valor primitivo. Da mesma forma que irá fornecer o código desembrulhar para você.

Assim, em vez de escrever (em pré-Java5) algo como:

Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;

você pode escrever:

Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;

eo código de boxe / unboxing é inserido pelo compilador.

List<String> list = (List<String>)object;

é um elenco.

void doSomething(Integer i) { ... }
...
doSomeething(5);

é auto-boxing.

Integer getSomething();
...
int i = getSomething();

é auto-unboxing.

Autoboxing foi introduzido em Java 5 para evitar que código como:

map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));

Agora você pode dizer:

map.put("ABC", 5);

Enquanto seu mais fácil -. Ele tem algumas armadilhas, se você não está completamente certo de que você está fazendo

encaixotamento está envolvendo um valor dentro de um recipiente, tal como um valor primitivo int dentro de um número inteiro objecto

A carcaça é apenas a forma de olhar para o tipo.

O ex produz outro tipo de valor, as mais tarde apenas modifica a forma de tratar um valor já existente

Exceto a conversão entre tipos primitivos realmente modifica a sua representação. (Isto não se tornar mais claro, não é?)

Boxing e unboxing é um tipo de elenco em Java, onde você joga a partir de uma primitiva de sua classe wrapper ou o inverso, por exemplo, booleano para booleano (caixa), ou booleana para booleano (unbox).

Tipos de moldes em Java, com exemplo:

  • uma conversão de identidade (§5.1.1) Cordas para String

  • a conversão primitivo alargamento (§5.1.2) byte para int

  • a conversão primitiva estreitamento (§5.1.3) int para byte

  • a conversão de referência alargamento (§5.1.5) Integer para o número

  • a conversão de referência estreitamento (§5.1.6) Número de Integer

  • a conversão de boxe (§5.1.7) int para Integer

  • uma conversão unboxing (§5.1.8). Integer para int

Autoboxing ou autounboxing acontece quando o compilador faz o boxe / conversão unboxing para você (ele não aparece explicitamente no código-fonte como uma expressão de conversão), por exemplo, veja a pergunta que você se referiu.

O Autoboxing e Unboxing pode ser aplicado no caso a seguir?

Long one = 10;
long two = 15;
Long three = 20;

if(one == three) //will this be unboxed or do we need to put a explicit
                 //condition like if(one.intValue() == three.intValue()) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  


if(one == two) //will this be unboxed or do we need to put a explicit
               //condition like if(one.intValue() == two) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top