Java: Qual é a diferença entre autoboxing e lançando?
-
20-08-2019 - |
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?
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:
-
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 classeA
, você pode pedir paramyB
uma instância deB
ser tratado como uma instância deA
escrevendo((A) myB)
sempre que uma referência a uma instância deA
poderia aparecer. Este não realmente produzir uma nova instância doA
.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 umString
em umMap
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étodolength
deString
. Mais uma vez, isso não causa um novoString
a ser criado. -
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.
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");