Varianza en el punto de uso
Proyecciones de tipos
Varianza en el punto de uso es una lección gratuita de Kotlin Academy 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 Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.
Varianza en el sitio de uso
A veces una clase genérica es invariante en general, pero una función concreta solo produce o solo consume el tipo. La varianza en el sitio de uso, también llamada proyección de tipos, aplica out o in justo en el lugar donde se utiliza un tipo.
Por qué utilizar la varianza en el sitio de uso
Una clase invariante como MutableList<T> no puede hacerse covariante en su declaración porque lee y escribe T. Sin embargo, una función concreta podría limitarse a leer de ella, y las proyecciones permiten expresarlo de forma segura.
Proyección out
Escribir Array<out T> como tipo de parámetro produce una vista covariante: puede leer T, pero no escribirlo. Esto permite pasar un Array<String> donde se espera un Array<out Any>.
fun printArray(items: Array<out Any>) {
for (item in items) println(item)
}
fun main() {
val names: Array<String> = arrayOf("Ann", "Bob")
printArray(names)
}Solo lectura
Con una proyección out, el compilador permite las lecturas, es decir, la salida, pero prohíbe las escrituras, es decir, la entrada, porque escribir podría infringir la seguridad de tipos del array original.
Proyección in
Escribir Array<in T> produce una vista contravariante: puede escribir T en ella, pero las lecturas devuelven Any?. Esto permite aceptar arrays de T o de cualquier supertipo.
fun fill(dest: Array<in Int>, value: Int) {
for (i in dest.indices) dest[i] = value
}
fun main() {
val numbers: Array<Number> = arrayOf(0, 0, 0)
fill(numbers, 7)
println(numbers.toList())
}Solo escritura
Con una proyección in puede escribir valores de T, es decir, la entrada, pero el tipo de elemento se considera el tipo superior para las lecturas, ya que el tipo real podría ser cualquier supertipo.
Proyecciones frente al sitio de declaración
La varianza en el sitio de declaración, como en class Box<out T>, se aplica en todos los lugares donde se utiliza la clase. Las proyecciones en el sitio de uso, como Box<out T> como parámetro, se aplican únicamente en ese lugar. Utilice proyecciones cuando la propia clase deba seguir siendo invariante.
La proyección estrella
Cuando el argumento de tipo no le importa en absoluto, use la proyección estrella *. List<*> significa una lista de algún tipo desconocido; puede leer los elementos como el límite superior, pero no puede escribir en ella de forma segura.
fun printSize(collection: List<*>) {
println("Size: ${collection.size}")
}
fun main() {
printSize(listOf(1, 2, 3))
printSize(listOf("a", "b"))
}Limitaciones de la proyección estrella
Con * aún puede llamar a miembros independientes del tipo, como size, y leer los elementos como Any?, pero no puede agregar elementos porque se desconoce el tipo real.
fun main() {
val unknown: List<*> = listOf("x", "y")
val first: Any? = unknown.first()
println(first)
}Elegir una proyección
Use out T cuando una función solo lee, in T cuando solo escribe y * cuando el tipo exacto es irrelevante. Estas proyecciones permiten usar clases invariantes de forma flexible y segura con respecto a los tipos.
Relación con los comodines de Java
Las proyecciones out T e in T de Kotlin corresponden a los comodines ? extends T y ? super T de Java. Si conoce los genéricos de Java, las proyecciones le resultarán familiares.
Comprobación rápida
¿Qué puede hacer con un parámetro cuyo tipo es Array<out Any>?
Resumen
La varianza en el sitio de uso aplica proyecciones out (solo lectura) o in (solo escritura) en un uso específico, y * como proyección estrella cuando se desconoce el tipo. Esto hace que las clases invariantes sean flexibles sin cambiar su declaración. A continuación, restringirá los parámetros de tipo mediante restricciones genéricas.
Preguntas frecuentes
¿La lección «Varianza en el punto de uso» es gratis?
Sí — el texto completo de «Varianza en el punto de uso» 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 Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Varianza en el punto de uso»?
Proyecciones de tipos Practicas Kotlin Academy 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 Kotlin Academy?
No se requiere experiencia previa. Kotlin Academy 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 «Varianza en el punto de uso»?
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 Kotlin Academy?
Sí. Cada lección de Kotlin Academy 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
- Funciones y clases genéricas
- Varianza en el punto de declaración
- Varianza en el punto de uso
- Restricciones de genéricos