Conversión de tipo

En el cálculo, el tipo de conversión se realiza para convertir un valor de un tipo (fuente) en otro (destino). También hablamos de coacción o reparto . Hay tres tipos de conversión (solo uno de los cuales realmente merece el nombre de conversión) según la relación de subtipo entre los tipos de origen y destino:

Conversión entre tipos incomparables

Es la coerción más antigua de la historia. Consiste (generalmente) en transformar físicamente la representación binaria de una variable para hacerla corresponder al tipo de objetivo. En lenguaje C , la conversión de una variable entera (normalmente codificada en complemento a dos) a un tipo real (normalmente codificada según el estándar IEEE ) es un ejemplo de este tipo de conversión. Debe manejarse con precaución porque no siempre es posible y puede dar lugar a resultados imprevistos.

Coerción de abajo hacia arriba

En el contexto de un lenguaje de objetos , la coerción ascendente hace posible tomar una instancia de la subclase para una instancia directa de la superclase . Esto se puede utilizar para evitar el uso de un método m específico de la subclase B, para reemplazarlo con el método m de una superclase A (considerando, por supuesto, que B es una subclase de A).

En otros lenguajes que utilizan subtipos, pero no el mecanismo de herencia , la coerción ascendente permite, por ejemplo, que una función acepte varios tipos de argumentos, subtipos del argumento declarado.

Coerción de arriba hacia abajo

Consiste en convertir el tipo estático del valor en su tipo dinámico . De este modo, permite reaparecer estáticamente el tipo dinámico del objeto. Por ejemplo, se usa en Java cuando se usa colección.

Las coacciones hacia arriba y hacia abajo no son una conversión de tipo real en el sentido de que no hay una transformación física de valor. Esto es básicamente una pista que se le da al compilador sobre cómo compilar un determinado mensaje de envío.

Un ejemplo

Una función de suma podría aceptar cualquier valor numérico. Suponiendo que hay un tipo numérico y dos de sus subtipos, Int y Double, aquí hay un ejemplo de código que usa coacciones:

add(a: Numeric, b: Numeric): Numeric = a + b a: Double = 1.2 b: Int = 3 res: Double = add(a,b) // res: Double = (Double)add((Numeric)a, (Numeric)b)

Tenga en cuenta que la adición en la función add probablemente requiere una conversión entre tipos incompatibles, que la llamada a la función usa dos coacciones ascendentes y que la asignación a res usa coerción descendente.

Ver también