Inferencia de tipos
Deje que el compilador determine los tipos
Inferencia de tipos es una lección gratuita de Scala for Backend Engineering & Functional Programming en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Scala for Backend Engineering & Functional Programming, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
¿Qué es la inferencia de tipos?
Scala tiene tipado estático, pero rara vez tendrá que escribir los tipos. El compilador los infiere a partir del valor situado a la derecha.
Esto le proporciona la seguridad de los tipos con la concisión de un lenguaje dinámico.
val n = 42 // inferred Int
val label = "hi" // inferred StringInferencia a partir de literales
Cuando escribe val x = 5, el compilador reconoce el literal Int y asigna a x el tipo Int.
Un literal decimal se convierte en un Double y el texto entre comillas se convierte en un String.
object Main extends App {
val count = 5
val ratio = 1.5
println(count + ratio)
}Inferencia de los valores devueltos por funciones
El compilador también puede inferir el tipo de retorno de un método a partir de su cuerpo.
Aquí square devuelve un Int porque el cuerpo multiplica dos valores Int. No ha tenido que indicarlo.
object Main extends App {
def square(x: Int) = x * x
println(square(6))
}Los parámetros siguen necesitando tipos
La inferencia tiene límites. Los parámetros de los métodos deben anotarse, porque el compilador no tiene de dónde inferirlos.
El fragmento siguiente no compilaría sin el : Int de x.
def increment(x: Int) = x + 1 // type on x is requiredTipo común inferido
Cuando los valores podrían ser de varios tipos, Scala infiere el tipo común más específico.
Mezclar un Int y un Double en una operación aritmética amplía el resultado a Double.
object Main extends App {
val mixed = 3 + 2.0 // Double
println(mixed)
}Inferencia en colecciones
Las colecciones infieren el tipo de sus elementos a partir de los valores que contiene.
Una lista de enteros se convierte automáticamente en List[Int], por lo que conserva toda la seguridad de tipos sin anotaciones.
object Main extends App {
val nums = List(1, 2, 3) // List[Int]
println(nums.sum)
}Cuando la inferencia le sorprende
A veces la inferencia elige un tipo más amplio del que desea. Una lista de números de distintos tipos puede inferirse como List[Double] o incluso List[AnyVal].
Si el tipo inferido no es adecuado para sus necesidades, añada una anotación explícita.
val a = List(1, 2.0) // List[Double]
val b = List(1, "two") // List[Any]Sobrescribir con anotaciones
Siempre puede ser explícito. Anotar un tipo documenta su intención y sobrescribe una inferencia demasiado restringida.
Aquí el literal 7 se amplía deliberadamente a un Long.
val seconds: Long = 7
val data: List[Int] = List(1, 2, 3)API públicas: sea explícito
Una regla de estilo habitual: deje que la inferencia gestione los val locales, pero escriba tipos de retorno explícitos en los métodos públicos.
Esto mantiene estable el contrato de su biblioteca aunque cambie la implementación.
def total(items: List[Int]): Int = items.sumLa inferencia mantiene la seguridad de tipos
La inferencia no debilita el sistema de tipos. El compilador sigue rechazando las operaciones no válidas.
A continuación, name se infiere como String, por lo que multiplicarlo por un número no compila, como debe ser.
val name = "Lia"
val bad = name * 3 // error: value * is not a member of String in this senseUn val inferido sigue siendo inmutable
La inferencia solo completa el tipo. No cambia si una vinculación es mutable.
Un val n = 10 sigue siendo inmutable y permanece fijado como un Int; el compilador simplemente le ahorró escribir : Int.
object Main extends App {
val n = 10 // inferred Int, still a val
println(n * n)
}Comprobación rápida
¿En qué caso sigue siendo necesario escribir un tipo en Scala?
Resumen
La inferencia de tipos permite que Scala sea conciso sin perder la seguridad del tipado estático.
- Los
vallocales y los tipos de retorno suelen inferirse. - Los parámetros de los métodos deben anotarse.
- La inferencia elige el tipo común más específico.
- Use anotaciones explícitas en las API públicas o para sobrescribir una inferencia inesperada.
Preguntas frecuentes
¿La lección «Inferencia de tipos» es gratis?
Sí — el texto completo de «Inferencia de tipos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Scala for Backend Engineering & Functional Programming, actualiza a CoddyKit PRO. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
¿Qué aprenderé en «Inferencia de tipos»?
Deje que el compilador determine los tipos Practicas Scala for Backend Engineering & Functional Programming con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Scala for Backend Engineering & Functional Programming?
No se requiere experiencia previa. Scala for Backend Engineering & Functional Programming en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Inferencia de tipos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Scala for Backend Engineering & Functional Programming?
Sí. Cada lección de Scala for Backend Engineering & Functional Programming incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- val frente a var
- Tipos básicos y literales
- Inferencia de tipos
- Expresiones frente a sentencias