Pregunta

Esta pregunta es acerca de "¿por Qué no autoboxing hacer algunas llamadas ambiguo en Java?"

Pero la lectura a través de las respuestas, hay una serie de referencias a la fundición y no estoy seguro de que estoy totalmente de entender la diferencia.

Alguien puede proporcionar una explicación sencilla?

¿Fue útil?

Solución

El boxeo es cuando convierte un tipo primitivo a un tipo de referencia, el desempaquetado es lo contrario. La conversión es cuando desea que un tipo sea tratado como otro tipo, entre tipos primitivos y tipos de referencia, esto significa una operación de boxeo implícita o explícita. Si necesita ser explícito es una característica del lenguaje.

Otros consejos

Vaciado y boxing/unboxing tienen que ver con los tipos y aparente (o real) la conversión, pero boxing/unboxing es específico a la relación entre tipos primitivos y sus correspondientes tipos de contenedor, mientras que el casting es el término para explícita o implícita de cambio de tipo en el sentido más general.

Casting es un término general con dos relacionados pero diferentes significados:

  1. El tratamiento de un valor de un tipo como si se tratara de un valor de otro tipo.Dos ejemplos de esta primera usos son:

    1.1.Dado que la clase B se extiende de la clase A, puede pedir myB una instancia de B para ser tratada como una instancia de A por escrito ((A) myB) dondequiera que una referencia a una instancia de A podría aparecer.En realidad no produce una nueva instancia de A.

    1.2.Pre-Java5 colecciones almacena todo el contenido como Object;esto generalmente requiere el uso de un yeso después de la recuperación de un objeto a partir de una colección.Por ejemplo, si había guardado String en un Map y necesario para conseguir su longitud, tendría que escribir algo como ((String) myMap.get(someKey)).length() donde el elenco sería necesario con el fin de llamar la length método de String.De nuevo, esto no causa una nueva String para ser creado.

  2. Explícitamente la conversión de un tipo a otro (es decir,explícitamente el cambio de la representación).Un ejemplo de este segundo uso es en la expresión ((int) (float_var + 0.5F)) que rondas de una variable de punto flotante por la adición de 0.5 (lo que produce un valor de punto flotante) y, a continuación, convertir explícitamente que el valor de un entero.El valor entero resultante (después de la (int) cast) es producido desde el otro valor por el cálculo interno.

La fundición se puede hacer cuando hay una superclase/subclase o interfaz/implementador relación (sentido 1) o cuando los dos tipos son primitivos tipos numéricos (es decir, 2).Usted puede buscar la "ampliación" y "restricción" para más detalles.

Boxeo se refiere a la envoltura de tipos primitivos en el contenedor de objetos, normalmente sólo se hace cuando debe tener un objeto (por ejemplo,para almacenar un valor en una colección).El primitivo y de envoltura de tipos vienen en pares:

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

Unboxing simplemente significa recuperar el valor primitivo desde dentro de su objeto contenedor.

Como de Java5, cuando se escribe una expresión que se utiliza un valor primitivo, donde el contenedor correspondiente tipo sería necesario (como poner un entero en una colección), el compilador automáticamente se desliza en el código que realmente se envuelve valor primitivo.Asimismo, se proporcionará el desembalaje de código para usted.

Así que en lugar de escribir (en pre-Java5) algo como:

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

se puede escribir:

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

y en el boxing/unboxing código es insertado por el compilador.

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

es un elenco.

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

es auto-boxeo.

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

es unboxing automático.

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 algunas dificultades si no está completamente seguro de lo que está haciendo.

El boxeo es envolver un valor dentro de un contenedor, como un valor primitivo int dentro de un objeto Integer

La conversión es solo cómo ver el tipo.

El primero produce otro tipo de valor, el segundo simplemente modifica cómo tratar un valor ya existente

Excepto que la conversión entre tipos primitivos en realidad modifica su representación. (Esto no lo hace más claro, ¿verdad?)

El boxing y unboxing es un tipo de conversión en Java, donde se convierte desde una clase primitiva a su clase envolvente o inversa, p. booleano a booleano (cuadro), o booleano a booleano (unbox).

Tipos de conversiones en Java, con ejemplo:

  • una conversión de identidad (& # 167; 5.1.1) Cadena a cadena

  • una conversión primitiva cada vez mayor (& # 167; 5.1.2) byte a int

  • una conversión primitiva estrecha (& # 167; 5.1.3) int al byte

  • una conversión de referencia cada vez mayor (& # 167; 5.1.5) Entero para numerar

  • una conversión de referencia de reducción (& # 167; 5.1.6) Número al entero

  • una conversión de boxeo (& # 167; 5.1.7) int a Integer

  • una conversión de unboxing (& # 167; 5.1.8). Entero para 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 conversión), p. vea la pregunta a la que se refirió.

¿Se pueden 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");  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top