HOWTO · Scala

Encuentra el tipo de variable en Scala

Este artículo habla sobre cómo encontrar el tipo de una variable en Scala.

En esta página

Scala no tiene una única operación typeof que responda a todas las preguntas sobre tipos. El tipo declarado o inferido de una variable es una propiedad de compilación; en tiempo de ejecución, puedes inspeccionar la clase de un objeto, ramificar según tipos conocidos, comprobar si un valor coincide con un tipo o solicitar metadatos de tipos genéricos. Elige la técnica según la información que necesite tu código.

Elige qué significado de tipo en tiempo de ejecución necesitas

Usa la coincidencia de patrones cuando conozcas los casos que debe manejar tu programa. Usa getClass para inspeccionar la clase de un objeto en tiempo de ejecución y getSimpleName cuando te resulte útil mostrar un nombre más corto. Usa isInstanceOf para comprobar con un valor booleano si se cumple un tipo especificado. Para obtener información sobre tipos genéricos, Scala también ofrece Manifest y TypeTag; son mecanismos de metadatos, no sustitutos universales de las demás operaciones.

Usa la coincidencia de patrones para tipos conocidos

La coincidencia de patrones comprueba el valor frente a los casos que escribes. Este ejemplo independiente etiqueta algunos valores comunes y devuelve un resultado alternativo para los demás. El lanzador desactiva el demonio de compilación de Scala para evitar la búsqueda del nombre del host al ejecutar el script:

scala -nocompdaemon -e '
def label(value: Any): String = value match {
  case _: String => "String"
  case _: Int => "Int"
  case _: Double => "Double"
  case _ => "Other"
}

List[Any]("hello", 42, 3.14).foreach(value => println(label(value)))
'
String
Int
Double

Este enfoque resulta útil cuando cada caso conocido requiere un comportamiento distinto. No detecta automáticamente todos los tipos posibles. Para una jerarquía personalizada sellada, compara sus clases de caso concretas e incluye un caso alternativo si la jerarquía o la entrada podrían abarcar más casos que los contemplados aquí.

Inspecciona la clase de un objeto en tiempo de ejecución con getClass

Llama a value.getClass para obtener la Class del objeto en tiempo de ejecución. Por ejemplo, val runtimeClass = value.getClass permite inspeccionar esa clase o compararla con otra. Esto describe la clase del objeto en tiempo de ejecución; no indica el tipo declarado de la variable ni describe por completo los argumentos de tipo genérico.

Para mostrar una etiqueta más corta, usa value.getClass.getSimpleName. Trata esa cadena como texto de presentación: los nombres de clase pueden variar según la implementación, y un nombre simple no es una API estable para comprobar tipos. Puedes inspeccionar una instancia personalizada del mismo modo que un objeto integrado.

Recupera información de tipos genéricos con Manifest y TypeTag

Los parámetros de tipo genérico no siempre están disponibles a partir de un objeto en tiempo de ejecución. Manifest y TypeTag de Scala proporcionan metadatos de tipo que se pueden solicitar en código genérico, según los metadatos disponibles para el tipo y el entorno de Scala utilizado. Por ejemplo, el código Scala puede declarar un parámetro de método como (implicit m: Manifest[T]) o usar un límite de contexto TypeTag[T] e inspeccionar los metadatos proporcionados para T.

Estos mecanismos pueden ser útiles cuando un método genérico necesita información sobre su parámetro de tipo. No garantizan información completa para todos los valores, y su representación en forma de cadena tampoco debe tratarse como un formato de serialización estable. Si solo necesitas ramificar según unos pocos casos conocidos o comprobar un tipo, la coincidencia de patrones o isInstanceOf es más directa.

Comprueba un valor con isInstanceOf

Usa value.isInstanceOf[SomeType] cuando solo necesites un resultado de true o false. Sirve tanto para un tipo personalizado especificado como para un tipo como String. La expresión indica si el valor supera esa comprobación de tipo; no devuelve una descripción del tipo ni revela el tipo de los elementos de una colección.

Si cada tipo requiere su propia rama, prefiere la coincidencia de patrones, que combina la comprobación y el tratamiento en una sola expresión. No uses una comprobación de tipo para inferir argumentos genéricos que no están disponibles en tiempo de ejecución.

Elige el método que se ajuste a tu tarea

  • Para manejar un conjunto conocido de alternativas, usa la coincidencia de patrones e incluye un caso alternativo.
  • Para inspeccionar o mostrar la clase de un objeto en tiempo de ejecución, usa getClass; usa getSimpleName solo para obtener una etiqueta concisa.
  • Para responder con sí o no a una pregunta sobre un tipo especificado, usa isInstanceOf.
  • Para solicitar metadatos de tipos genéricos en código genérico, considera Manifest o TypeTag y ten en cuenta los metadatos disponibles en tu entorno de Scala.

Ninguno de estos métodos es un typeof universal: el tipo declarado pertenece a la comprobación en tiempo de compilación, mientras que las operaciones en tiempo de ejecución solo exponen la clase, la comprobación o los metadatos concretos que están diseñados para proporcionar.