2009-02-01 17 views
21

This question es sobre "¿Por qué el autoboxing hace que algunas llamadas sean ambiguas en Java?"Java: ¿Cuál es la diferencia entre autoboxing y casting?

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?

+0

http://java.sun.com/docs/books/jls/third_edition/html/conversions.html parece útil –

Respuesta

33

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.

+2

Creo que esta es la respuesta correcta, pero no creo que el boxeo/unboxing deba describirse como una "conversión". Podría ser más claro decir que la primitiva se está envolviendo en un Objeto equivalente. –

+0

Programador de @Outlaw: estoy de acuerdo, eso sería más preciso. – cmsjr

+0

¿algún ejemplo? . – Faizan

7
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.

+1

La clave aquí es que entero es un tipo de referencia e int (o el número 5) es un tipo de valor/primitivo. –

+2

Su segundo ejemplo sería auto-boxing si hubiera escrito 'doSomething' correctamente ... –

3

Autoboxing se introdujo en Java 5 para evitar código como:

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

Ahora puede decir:

map.put("ABC", 5); 

Mientras que su más fácil - sí tiene algunas trampas si no está completamente seguro de lo que estás haciendo.

0

boxeo está terminando un valor dentro de un contenedor, como un valor simple int dentro de un objeto entero

Casting es lo que mira el tipo.

El primero produce otro tipo de valor, el más tarde sólo modifica cómo tratar a un valor ya existente

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

0

Boxeo y unboxing es un tipo de elenco en Java, donde se lanza de una primitiva a su clase contenedora o la inversa, p. booleano a booleano (cuadro), o booleano a booleano (unbox).

Los tipos de cilindros en Java, con ejemplo:

  • una conversión de identidad (§5.1.1) cadena a

  • una conversión primitiva ensanchamiento (§5.1.2) bytes a int

  • una conversión primitiva estrechamiento (§5.1.3) int a byte

  • una conversión de referencia ensanchamiento (§5.1.5) de entero a Número

  • una conversión de referencia estrechamiento (§ 5.1.6) Número Entero a

  • una conversión de boxeo (§5.1.7) int a INTEGER

  • una conversión unboxing (§5.1.8). Entero a int

Autoboxing o autounboxing ocurre cuando el compilador realiza la conversión de boxeo/unboxing para usted (que no aparece explícitamente en el código fuente como una expresión de conversión), por ejemplo, vea la pregunta a la que se refiere.

24

Tanto la fundición como el boxeo/desempaquetado tienen que ver con tipos y conversión aparente (o real), pero el boxeo/desempaquetado es específico de la relación entre tipos primitivos y sus tipos de envoltura correspondientes, mientras que el casting es explícito o implícito cambio de tipo en el sentido más general.

casting es un término general con dos significados relacionados-pero-diferente:

  1. El tratamiento de un valor de un tipo como si se tratara de un valor de otro tipo. Dos ejemplos de este primer uso son:

    1.1. Dado que la clase B amplía la clase A, puede solicitar myB una instancia de B para tratar como una instancia de A escribiendo ((A) myB) donde pueda aparecer una referencia a una instancia de A. Esto en realidad no produce una nueva instancia de A.

    1.2. Las colecciones anteriores a Java5 almacenaron 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 hubiera almacenado String en un Map y necesitara obtener su longitud, escribiría algo como ((String) myMap.get(someKey)).length() donde se requeriría el elenco para llamar al método length de String. De nuevo, esto no provoca que se cree un nuevo String.

  2. Explicitamente convirtiendo un tipo en otro (es decir, cambiando 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 a un número entero. El valor entero resultante (después del molde (int)) es producido del otro valor por cálculo interno.

fundición puede realizarse cuando hay una superclase/subclase o relación interfaz/implementador (es decir, 1 arriba) o cuando los dos tipos son primitivos tipos numéricos (es decir, 2). Puede buscar "ampliación" y "estrechamiento" para obtener más detalles.

Encajonamiento se refiere a envolver tipos primitivos en objetos contenedores, por lo general solo cuando se debe tener un objeto (por ejemplo, almacenar un valor en una colección).Los tipos primitivos y la envoltura vienen en pares:

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

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

A partir de Java5, cuando escribe una expresión que utiliza 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 envuelve ese valor primitivo . Asimismo, proporcionará el código de desenvolvimiento 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; 

puede 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 se inserta por el compilador.

+0

Muy bien descrito. Ejemplos ftw! – sector7

0

¿Se puede aplicar Autoboxing and 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"); 
+0

durante la 2da prueba de igualdad, el auto-unboxing pasa al tipo primitivo [El código modificado se está ejecutando aquí] (http://ideone.com/R228Q6) – Abhijeet

Cuestiones relacionadas