generic - Java: ¿Cuál es la diferencia entre el autoboxing y el casting?
generic java (7)
¿Se puede aplicar Autoboxing y Unboxing en el siguiente caso?
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");
Esta pregunta se trata de "¿Por qué el autoboxing hace que algunas llamadas sean ambiguas en Java?"
Pero leyendo las respuestas, hay varias referencias al casting y no estoy seguro de entender completamente la diferencia.
¿Alguien puede dar una explicación simple?
Autoboxing se introdujo en Java 5 para evitar códigos como:
map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));
Ahora puedes decir:
map.put("ABC", 5);
Si bien es más fácil, tiene algunos inconvenientes si no está completamente seguro de lo que está haciendo.
El boxeo es cuando se convierte un tipo primitivo a un tipo de referencia, el desembalaje es al revés. Casting es cuando quieres que un tipo sea tratado como otro tipo, entre los tipos primitivos y los tipos de referencia, esto significa una operación de box implícita o explícita. Si necesita ser explícito es una función de idioma.
El boxeo está envolviendo un valor dentro de un contenedor, como un valor primitivo int dentro de un objeto Integer
Casting es solo cómo mirar el tipo.
El primero produce otro tipo de valor, el último simplemente modifica cómo tratar un valor ya existente
Excepto que el lanzamiento entre tipos primitivos modifica su representación. (Esto no lo hace más claro, ¿verdad?)
El boxeo y el desempaquetado es un tipo de elenco en Java, donde se lanza de una primitiva a su clase contenedora o la inversa, por ejemplo, booleana a booleana (casilla), o booleana a booleana (casilla).
Tipos de moldes en Java, con un ejemplo:
una conversión de identidad (§5.1.1) Cadena a cadena
una conversión primitiva ensanchada (§5.1.2) byte a int
una conversión primitiva de estrechamiento (§5.1.3) int to byte
una conversión de referencia de ampliación (§5.1.5) Entero a Número
una conversión de referencia de reducción (§5.1.6) Número a entero
una conversión de boxeo (§5.1.7) int a Integer
una conversión de unboxing (§5.1.8). Entero a int
Autoboxing o autounboxing ocurre cuando el compilador realiza la conversión de boxing / unboxing por usted (no aparece explícitamente en el código fuente como una expresión de molde), por ejemplo, vea la pregunta a la que hace referencia.
Tanto el casting como el boxeo / unboxing tienen que ver con los tipos y la conversión aparente (o real), pero el boxeo / desempaquetado es específico de la relación entre los tipos primitivos y sus correspondientes tipos de envoltura, mientras que el término casting es explícito o implícito. el sentido más general.
Casting es un término general con dos significados relacionados pero diferentes:
Tratando un valor de un tipo como si fuera un valor de otro tipo. Dos ejemplos de este primer uso son:
1.1. Dado que la clase
B
extiende la claseA
, puede solicitar quemyB
una instancia deB
se trate como una instancia deA
escribiendo((A) myB)
siempre que pueda aparecer una referencia a una instancia deA
Esto en realidad no produce una nueva instancia deA
1.2. Las colecciones anteriores a Java5 almacenaban todo el contenido como
Object
; esto generalmente requiere que uses un yeso después de recuperar un objeto de una colección. Por ejemplo, si ha almacenado unaString
en unMap
y necesita obtener su longitud, escribiría algo como((String) myMap.get(someKey)).length()
donde se requeriría el molde para llamar el método delength
deString
. Nuevamente, esto no causa que se cree una nuevaString
.Convertir explícitamente un tipo a otro (es decir, cambiar explícitamente la representación). Un ejemplo de este segundo uso está en la expresión
((int) (float_var + 0.5F))
que redondea una variable de coma flotante agregando 0.5 (que produce un valor de coma flotante) y luego convierte explícitamente ese valor en un entero. El valor entero resultante (después del molde(int)
) se produce a partir del otro valor mediante cómputo interno.
La conversión se puede realizar cuando hay una relación de superclase / subclase o interfaz / implementador (es decir, 1 anterior) o cuando los dos tipos son tipos numéricos primitivos (es decir, 2). Puede buscar "ampliación" y "estrechamiento" para obtener más detalles.
El boxeo se refiere a envolver tipos primitivos en objetos contenedores, generalmente solo cuando se debe tener un objeto (por ejemplo, almacenar un valor en una colección). Los tipos primitivos y de envoltura vienen en pares:
int Integer
long Long
boolean Boolean
... ...
Unboxing simplemente significa recuperar el valor primitivo desde dentro de su contenedor de objetos.
A partir de Java5, cuando se escribe una expresión que usa un valor primitivo donde sería necesario el tipo de envoltura correspondiente (como poner un entero en una colección), el compilador automáticamente desliza el código que realmente ajusta ese valor primitivo. Asimismo, proporcionará el código de desenvolvimiento para usted.
Entonces, en lugar de escribir (en pre-Java5) algo así como:
Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;
puedes escribir:
Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;
y el código de boxeo / unboxing es insertado por el compilador.
List<String> list = (List<String>)object;
es un elenco
void doSomething(Integer i) { ... }
...
doSomeething(5);
es auto-boxing.
Integer getSomething();
...
int i = getSomething();
es auto-unboxing.