Casting (casteo) de tipos de datos en Java

En la mayoría de los lenguajes tipados –como Java, C, C++, etc– en ocasiones es necesario cambiar el tipo de valor. Para estos casos, a veces se hace la conversión en automático pero en otrasse tiene que realizar un paso intermedio. A este proceso se le llama casting, casteo o simplemente “conversión de tipos”.

En Java, hay dos tipos de casting: el implícito y el explícito. Cada uno, como se verá a continuación, tiene sus particularidades.

Casting implícito

El casting implícito es aquel que realiza de forma automática el compilador, es decir, no se requiere realizar una acción en particular.

Para que esto suceda, en el caso de valores de la misma clase (enteros o fraccionarios), el tipo de dato original tiene que ocupar en memoria (bytes) un valor igual o menor al que se quiere cambiar.

En cuanto a valores de distintas clases, también se puede hacer el casting implícito, sin embargo, solo se puede hacer de números enteros a decimales y no al revés. (Más información: Tipos de datos en Java)

Esto se puede visualizar de forma más sencilla en el siguiente diagrama:

Con valores:

byte (1 Byte) → short (2 Bytes) → int (4 bytes) → Long (8 bytes) → float (4 bytes) → double (8 bytes) char (2 Bytes)

Es decir: los tipos de valores de la izquierda se pueden pasar a cualquier tipo que esta a la derecha de forma automática.

Un ejemplo para entender el casting implicito

byte num1 = 10;
int num2 = num1;

//num2 es igual a 10 

O en el caso de valores de diferente tipo

short valueA = 23;
double valueB = valueA;

//valueB es igual a 23

También se puede realizar la conversión de char a int.

char letterH = 'H';
int valueLetter = letterH;

//El valor de "valueLetter" es 70, que es el valor ASCII de la letra "H" mayuscula. 

Por cierto, una particularidad del tipo de casting implícito es que no genera perdida de información (en la mayoría de los casos) al realizar la conversión, así que no hay mucho problema al utilizarse en aplicaciones que requieren precisión.

Casting explícito

Para los casos donde no ser puede realizar el casting implícito, por ejemplo, de un tipo long a un int o de un float a un long, lo que se tiene que realizar es el casting explícito.

A grandes rasgos, para que el programador realice el casting explícito, es necesario escribir el tipo de dato que se quiere convertir antes del valor.

(TipoAConvertir) valor

En un ejemplo real, donde se pasa de tipo long a entero, sería así:

long million = 1_000_000;
int integerMillion = (int) million;

//El valor de "integerMillion" es 1000000

En el caso de conversiones de diferentes tipos de valores:

float decimalNumber = 3.14F;
int intergerNumber = (int) decimalNumber;

//el valor de "intergerNumber" es 3 

A diferencia del implícito, aquí sí puede existir pérdida de información, así que en casos donde se requiera gran precisión, no es recomendable realizarlo.

https://hyperskill.org/learn/step/3510

Consideraciones

Aunque no es muy recomendable, es posible realizar el casting explícito en los casos en los que se puede realizar de forma implícita. Esta tarea es redundante, por lo que lo único que causa es que el código dea menos legible:

short age = 28;
int newAge = (int) age; 

//Funciona, ya que "newAge" es 28, pero no es recomendable.

Otro punto importante que hay que tener en cuenta es que en Java, a diferencia de otros lenguajes de programación, no es posible realizar conversiones de valores booleanos de forma nativa.

Recapitulación

  • Casting significa el cambio del tipo de dato de un valor a otro.
  • Existen dos tipos de casting: el implícito y el explícito.
  • Para el implícito, no es necesario realizar alguna acción en particular, pero tiene que existir compatibilidad entre los datos.
  • El casting explicito es usado para los casos que no se pueden resolver con la forma implícita.
  • Para el explícito, es necesario poner entre paréntesis el tipo de valor al que se quiere convertir al momento de hacer la asignación.
  • No es posible hacer la conversión de booleanos de forma nativa.

Cuestionario

¿Es posible hacer un casting implicito de long a double?

Si es posible, ya que siguiendo el diagrama mostrado, el long está a la izquierda del double.