2010-10-29 8 views

Respuesta

17

Tipo fundición es el tratamiento de un valor (bloque de memoria) referenciado por una variable como siendo de un tipo diferente que el tipo de la variable se declara como.

Tipo conversión actual ejercicio de una conversión de ese valor.

En muchos idiomas, algunos modelos (generalmente los numéricos) dan lugar a conversiones (esto variará bastante según el idioma), pero sobre todo es solo "trata esta X como una Y".

Como la mayoría de los aspectos del lenguaje humano, por desgracia, los términos se usan de forma ligeramente diferente en diferentes comunidades, en su mayoría a lo largo de líneas lingüísticas. Por ejemplo, ver el comentario de James a continuación sobre C++   — La palabra "moldear" tiene un significado mucho más amplio que la definición anterior, que está más en el molde C o Java. Y solo para hacer las cosas divertidas, Java Language Spec realmente entra en varios tipos de moldes, incluido casting conversions. Pero lo anterior es una buena regla empírica.

Sin embargo, para tomar un caso simple:

En Java, antes de los genéricos no era raro tener que hacer un montón de encasillamiento cuando se trata de mapas:

Map m = new HashMap(); 
m.put("one", "uno"); 

// This would give a compiler error, because although we know 
// we'll get a String back, all the compiler knows is that it's 
// an Object 
String italian = m.get("one"); 

// This works, we're telling the compiler "trust me, it's a String" 
String italian = (String)m.get("one"); 

Afortunadamente, la adición de generics se ocupó de esto, ya que la fundición de esta manera tiende a ser un proceso frágil con problemas de mantenimiento.

Por el contrario, se había convertir si has tenido una cadena de dígitos:

String s = "1234"; 

... y necesita saber qué número de esos dígitos representados en decimal:

// Wrong (cast) 
int n = (int)s; 

// Right (conversion) 
int n = Integer.parseInt(s, 10); 
+0

¿Podría darme ejemplos para el encasillado y la conversión de tipo? – Jagan

+0

@Jagan: Curiosamente, solo estaba haciendo eso. :-) –

+0

Al menos en C++, el uso del término _cast_ no es tan limitado; hay varios (cuatro) tipos de moldes. La reinterpretación es solo una de ellas y es la que se usa menos comúnmente. –

7

Typecasting es simplemente tomar un bolígrafo y escribir "esto es ahora un int" en la variable, la conversión es en realidad convertir el contenido al tipo deseado por lo que el valor sigue teniendo un sentido.

4

De acuerdo con la Wikipedia article:

"En la familia de C de los idiomas, el reparto de la palabra por lo general se refiere a un explic escribe conversión (en oposición a una conversión implícita), independientemente de si se trata de una reinterpretación de un patrón de bits o una conversión real."

Aquí es un C++ ejemplo:

double d = 42.0; 
int i = d; // Here you have an implicit conversion from double to int 
int j = static_cast<int>(d); // Here you have a cast (explicit conversion). 

He aquí un ejemplo de Java (tenga en cuenta que en Java a diferencia de C++ no se puede convertir implícitamente de doble a int):

int i = 42; 
double d = i; // Here you have an implicit conversion from int to double 
int j = (int)d; // Here you have a cast (explicit conversion). 
6

Tipo conversión:.

double value = 3; // implicit conversion to double value 3.0 
int nValue = 3.14156; // implicit conversion to integer value 3 

casting es una solicitud por el programador para hacer una conversión explícita de tipos

int nValue = 10; 
double dvalue = double(nValue); // explicit type casting 
5

Los términos a menudo se usan indistintamente.

Java

Tipo de fundición y conversión de tipos son la misma cosa en Java, aunque si alguien dice que son de fundición, generalmente se refieren a una conversión explícita.

Un lanzamiento en Java se realizará en tiempo de ejecución, por lo que puede fallar (lanzar una excepción). Algunos tipos de conversiones no válidas pueden capturarse en tiempo de compilación. Cuando el molde falla, la instancia se asentó en una referencia object, por lo que el compilador no pudo decir qué molde se iba a realizar, hasta que realmente ejecutó el código.

C++

Tipo de fundición y conversión de tipo son diferentes en C++. Hay cinco tipos de moldes en C++, que tienen comportamientos diferentes: static_cast, dynamic_cast, reinterpret_cast, const_cast y moldes de estilo c ((int)someVariable).

Algunos modelos de C++ realizan conversión de tipo (de ahí la razón por la cual este concepto es confuso), código de llamada y, potencialmente, verificaciones de tiempo de ejecución. Otros moldes de C++ simplemente simulan el cambio de tipo de la variable de referencia: ninguna memoria se modificará, moverá o copiará, por lo que es posible que el tipo de datos resultante no se convierta correctamente. Esto puede dar una gran velocidad en el tiempo de ejecución y puede ser una herramienta poderosa para el código de bajo nivel, pero tiende a evitarse para el código de alto nivel.

Tenga en cuenta que la sintaxis del molde c-style (que se ve exactamente igual que la sintaxis de Java) es uno de los modelos que no necesariamente llamará al código de conversión.

La conversión de tipo en C++ a menudo se refiere a llamar a un constructor de copias u operador de asignación, que copiará los datos a una nueva instancia de una clase/estructura diferente. Si un tipo tiene operadores de conversión definidos, entonces la sintaxis de conversión podría verse como un molde, o simplemente una asignación directa. La principal diferencia aquí es que se llama al código para hacer la conversión.

7

Tal vez un ejemplo puede ayudar:

  • Si lanzas 33 a una cadena, se obtiene "!".
  • Si convierte33 en una cadena, obtiene "33".

[Nota: este ejemplo hace todo tipo de supuestos no-necesariamente-válidas sobre las codificaciones y en memoria representaciones de números y cadenas, pero espero que el mecanismo está claro.]

+0

Sí.Buen ejemplo. – Jagan

0

de un objeto primitiva a -> Tipo de conversión

String s = "1234"; 
int i = Integer.parseInt(s); 
int j = Integer.valueOf(s); 

de una primitiva de objeto -> conversión de tipo

int i = 55; 
String s = String.valueOf(i); 
String t = Integer.toString(i); 

de una primitiva a primitiva (o un objeto a otro) -> conversión de tipos (explícita cuando el estrechamiento e implícita cuando ensanchamiento)

//explicit 
double d = 3.14156; 
int i = (int)d; 
//implicit 
int i = 100; 
double d = i; 

Nota: En caso de tipo de objeto de fundición, que no se puede utilizar la referencia de clase del niño para sostener objeto padre

Cuestiones relacionadas