Casting y conversión de tipos
Cuando el dato que tienes no es del tipo que necesitas. Unas conversiones las hace Apex solo; otras las pides tú, y alguna puede fallar en ejecución.
✓ En esta sub-lección
- 01Distinguir la conversión que Apex hace sola de la que tienes que pedir.
- 02Pasar de texto a número y de número a texto sin perder datos por el camino.
- 03Usar el operador de casting con sObjects y saber por qué puede fallar.
La nutria: ¿Te acuerdas? · Repaso de la lección 8
Quieres las regiones distintas de una lista de cuentas, sin repetidos. ¿Qué colección usas?
Cambiar un campo de Texto a Número en Setup lanza una advertencia: «los datos que no se puedan convertir se perderán». Esa advertencia es, palabra por palabra, de lo que trata esta sub-lección.
String raw = '19.99';- '19.99'String
Paso 1 de 7
El dato llega de un formulario o de una integración, así que llega como texto. Parece un número, pero entre comillas es un String: no sabe multiplicarse.
Lo que Apex hace por su cuenta
Si el valor cabe sin perder nada en el tipo de destino, la conversión es automática. Un Integer cabe en un Decimal, así que puedes asignarlo directamente y nadie protesta. Es la misma lógica que permite ampliar un campo de Texto(40) a Texto(255) sin advertencias.
Integer units = 5;
Decimal price = units; // automático: 5 cabe en un Decimal
Long bigNumber = units; // automático
Decimal total = units * 19.99; // el Integer se amplía para operarLo que tienes que pedir
En sentido contrario hay pérdida: un Decimal en un Integer deja los decimales fuera. Por eso Apex no lo hace solo y hay que llamar a un método que diga qué quieres exactamente: cortar, redondear o ajustar decimales.
| Método | Qué hace con 19.99 | Devuelve |
|---|---|---|
| intValue() | 19: corta, no redondea. | Integer |
| round() | 20: redondea al entero más cercano. | Long |
| setScale(1) | 20.0: ajusta los decimales. | Decimal |
| longValue() | 19: como intValue pero con más rango. | Long |
Texto y número nunca se convierten solos
Un texto que parece un número sigue siendo un texto: '42' no es 42, igual que en una fórmula necesitabas VALUE() y TEXT(). La conversión se pide con valueOf(), que se le escribe al tipo de destino.
String raw = '42';
Integer units = Integer.valueOf(raw); // texto → número entero
Decimal price = Decimal.valueOf('19.99'); // texto → decimal
String label = String.valueOf(42); // número → texto
// Y funciona con cualquier cosa, no solo números:
String dateText = String.valueOf(Date.today());La nutria: Convertir y redondear en una línea: TEXT(ROUND(…)) en Apex
Decimal total = Decimal.valueOf('1234.5678');
// Desarmado: dos pasos con nombre
Decimal rounded = total.setScale(2); // 1234.57
String label1 = String.valueOf(rounded); // '1234.57'
// Anidado: los mismos dos pasos en una línea
String label2 = String.valueOf(total.setScale(2)); // '1234.57'
// Y de texto a número a texto, con un cálculo en medio
String doubled = String.valueOf(Integer.valueOf('21') * 2); // '42'El operador de casting: los paréntesis
Hay un tercer caso, y es el que de verdad se llama casting en Apex: cuando tienes un valor guardado en un tipo genérico y quieres tratarlo como el tipo concreto que sabes que es. Se escribe el tipo destino entre paréntesis delante del valor.
sObject record = new Account(Name = 'Northwind');
// Como sObject, solo se ven los métodos genéricos
Account account = (Account) record; // casting: ahora es una Account
String name = account.Name;La nutria: Como abrir un registro sin saber de qué objeto es
sObject record = new Account(Name = 'Northwind');
Contact wrong = (Contact) record; // 💥 TypeException en ejecución