CodeGym /Cursos /JAVA 25 SELF /Conversión de tipos explícita e implícita en Java

Conversión de tipos explícita e implícita en Java

JAVA 25 SELF
Nivel 6 , Lección 5
Disponible

1. Conversión implícita (automática) de tipos

En Java (como en otros lenguajes), las variables tienen un tipo estricto: si una variable se declara como int, solo puede almacenar números enteros, y si se declara como double, solo números de coma flotante. Pero en programas reales a menudo surge la situación en la que hay que «traspasar» un valor de una variable a otra de distinto tipo. Por ejemplo:

  • Recibimos de un método un int, pero queremos usarlo como double para cálculos con decimales.
  • Guardamos el código de un carácter como número (int) y queremos obtener el propio carácter (char).
  • Tenemos un resultado en double, pero necesitamos un entero (int), por ejemplo, para mostrar la cantidad de manzanas enteras.

En Java hay dos formas principales de conversión de tipos: implícita (automática) y explícita (manual).

¿Qué es?

La conversión implícita es cuando Java convierte por sí sola, «sin tu intervención», un valor de un tipo a otro, si esto es seguro y no provoca pérdida de datos.

Esto ocurre cuando asignas un valor de un tipo más pequeño a una variable de un tipo más grande. Por ejemplo, de int a double, de char a int, de float a double.

Analogía: imagina que tienes un vaso de agua (int) y un cubo (double). Si viertes el agua del vaso en el cubo — no se derrama nada, todo cabe. En estos casos, Java permite la conversión automática.

Ejemplo: int double

int apples = 5;
double applesWeight = apples; // int se convierte automáticamente en double

System.out.println(applesWeight); // 5.0

Ejemplo: char int

Cada carácter en Java es simplemente un número de la tabla Unicode. Por eso, la conversión de char a int ocurre automáticamente:

char letter = 'A';
int code = letter; // 'A' se convierte en 65 (código del carácter en Unicode)

System.out.println(code); // 65

Tabla de conversiones implícitas

Origen Se puede convertir implícitamente a
byte
short, int, long, float, double
short
int, long, float, double
char
int, long, float, double
int
long, float, double
long
float, double
float
double

Importante: La conversión implícita solo funciona en sentido de «ampliación» (de menor a mayor).

2. Conversión explícita (manual) de tipos (type casting)

La conversión explícita se requiere cuando quieres convertir un valor de un tipo mayor a uno menor o entre tipos incompatibles. En ese caso, Java exige que indiques explícitamente que eres consciente de la posible pérdida de datos.

Analogía: intentas verter agua de un cubo (double) a un vaso (int) — parte del agua puede derramarse, y Java te pide que digas: «¡Sí, entiendo que parte de los datos puede perderse!»

Sintaxis


tip_naznacheniya peremennaya = (tip_naznacheniya) vyrazhenie;
Sintaxis de la conversión explícita (cast)

Ejemplo: double int

double price = 12.99;
int roundedPrice = (int) price; // ¡la parte fraccionaria simplemente se descarta!

System.out.println(roundedPrice); // 12

Atención: ¡No hay redondeo! Simplemente se «corta» todo lo que sigue al punto decimal. Para redondear, usa Math.round().

Ejemplo: int char

int code = 66;
char letter = (char) code; // 66 es el carácter 'B'

System.out.println(letter); // B

Ejemplo: double float

double d = 3.1415926535;
float f = (float) d; // se pierde parte de la precisión

System.out.println(f); // 3.1415927 (menos cifras decimales)

3. Conversión entre números y caracteres (char y números)

¿Por qué es posible?

En Java, los caracteres (char) en realidad son solo números de la tabla Unicode. Por eso se pueden convertir libremente a int y viceversa.

Ejemplo: char int

char ch = '\u0416';
int code = ch;

System.out.println(code); // 1046

Ejemplo: int char

int code = 8364;
char symbol = (char) code;

System.out.println(symbol); // €

Práctica: imprimimos el alfabeto

for (int i = 65; i < 65 + 26; i++) {
    System.out.print((char) i + " ");
}
// Imprimirá: A B C D ... Z

4. Conversión entre enteros y números en coma flotante

int double (implícita)

int count = 10;
double avg = count; // ampliación implícita

System.out.println(avg); // 10.0

double int (explícita)

double score = 8.75;
int rounded = (int) score;

System.out.println(rounded); // 8

¿Cómo redondear según las reglas matemáticas?

Si necesitas no solo «cortar» la parte decimal, sino redondear al entero más cercano, utiliza Math.round():

double price = 8.75;
int rounded = (int) Math.round(price);

System.out.println(rounded); // 9

5. ¿Qué ocurre al «reducir» el tipo? Pérdida de datos

Ejemplo: int byte

int big = 300;
byte small = (byte) big;

System.out.println(small); // 44 (!)

¿Por qué 44? Porque byte almacena valores de -128 a 127, y si el número no cabe, ocurre un «recorte» módulo 256 (resto de la división).

Ejemplo: double int

double d = 1e20;
int i = (int) d;

System.out.println(i); // -2147483648 (valor mínimo de int)

Un número grande no cabe en el rango de int, y el resultado se vuelve «extraño».

6. Conversión en cálculos: tipos «mixtos»

Ejemplo: int + double

int a = 3;
double b = 2.5;
double result = a + b; // int se convertirá automáticamente en double

System.out.println(result); // 5.5

Ejemplo: char + int

char ch = 'A'; // 65
int offset = 2;
char next = (char) (ch + offset);   // char se convertirá automáticamente en int

System.out.println(next); // C

7. Conversión entre números y cadenas

Aunque esto no es exactamente «casting de tipos», a menudo surge la tarea de convertir un número en cadena y viceversa.

int String

int x = 123;
String s = Integer.toString(x);
// o simplemente: String s = "" + x;

String int

String s = "456";
int x = Integer.parseInt(s);

8. Errores típicos y matices

Error n.º 1: Pérdida de la parte decimal al convertir de double int. Muy a menudo los principiantes piensan que (int) 3.99 dará 4. En realidad el resultado es 3, la parte fraccionaria simplemente se descarta. Para un redondeo correcto usa Math.round().

Error n.º 2: La «reducción» implícita no funciona. No puedes escribir sin más int x = 300; byte b = x; — el compilador producirá un error. Debes indicar explícitamente (byte) x, pero prepárate para resultados extraños si el número excede el rango de byte.

Error n.º 3: Conversión entre tipos incompatibles. No puedes escribir (int) "123" — una cadena debe convertirse a número mediante Integer.parseInt().

Error n.º 4: Problemas con char y int. La conversión de int a char solo funciona para valores que realmente existen en Unicode. Si pasas un número grande, el resultado será un carácter inesperado.

Error n.º 5: Tipos mixtos en expresiones. Si una expresión contiene int y double, el resultado será siempre double. Esto puede afectar inesperadamente a la lógica del programa si esperabas un número entero.

Error n.º 6: ¡Redondear no es conversión de tipo! (int) x no es redondear, sino simplemente descartar la parte decimal. Para redondear, usa Math.round().

1
Cuestionario/control
Números de coma flotante, nivel 6, lección 5
No disponible
Números de coma flotante
Números de coma flotante y char
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION