Restricciones de genéricos
Limite los parámetros de tipo
Restricciones de genéricos es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 4 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.
Restringir parámetros de tipo
A veces un genérico debe aceptar solo determinados tipos, por ejemplo, tipos que se puedan comparar o que sean subclases de una clase base. Las restricciones genéricas establecen un límite superior para un parámetro de tipo.
El límite superior predeterminado
Sin una restricción, el límite superior de un parámetro de tipo es Any?, por lo que acepta cualquier tipo, incluidos los anulables. Para permitir únicamente tipos no anulables, establézcalo como subtipo de Any.
fun <T : Any> requireNonNull(value: T): T {
return value
}
fun main() {
println(requireNonNull(42))
}Un solo límite superior
Use T : Bound para exigir que T sea un subtipo de Bound. Esto le permite llamar a los miembros de ese límite dentro de la función.
fun <T : Number> sumDoubled(a: T, b: T): Double {
return a.toDouble() * 2 + b.toDouble() * 2
}
fun main() {
println(sumDoubled(3, 4))
println(sumDoubled(1.5, 2.5))
}Límite Comparable
Un límite habitual es Comparable<T>, que permite comparar elementos con <, > o compareTo.
fun <T : Comparable<T>> maxOf2(a: T, b: T): T {
return if (a > b) a else b
}
fun main() {
println(maxOf2(3, 9))
println(maxOf2("apple", "banana"))
}Llamar a miembros del límite
Dentro de un genérico restringido, el compilador sabe que T dispone de la API del límite, por lo que puede llamar directamente a esos métodos sin conversiones de tipo.
fun <T : CharSequence> describe(value: T): String {
return "Length is ${value.length}"
}
fun main() {
println(describe("hello"))
println(describe(StringBuilder("hi")))
}Varios límites con where
Para usar más de un límite, utilice la cláusula where. En ese caso, T debe cumplir TODAS las restricciones indicadas.
fun <T> copyWhenValid(value: T): T
where T : CharSequence, T : Comparable<T> {
return value
}
fun main() {
println(copyWhenValid("text"))
}Límites en clases
Las restricciones también funcionan en clases genéricas, ya que limitan los tipos con los que se puede crear una instancia de la clase.
class NumberBox<T : Number>(val value: T) {
fun asDouble(): Double = value.toDouble()
}
fun main() {
val box = NumberBox(10)
println(box.asDouble())
}La restricción habilita operaciones
El objetivo de una restricción es habilitar operaciones. Sin T : Number, no podría llamar a toDouble(); el límite garantiza que el método exista.
Límite no anulable en la práctica
Establecer Any como límite rechaza los argumentos anulables en tiempo de compilación, una forma práctica de exigir genéricos no anulables.
fun <T : Any> firstNonNull(a: T, b: T): T = a
fun main() {
println(firstNonNull("x", "y"))
// firstNonNull(null, "y") would not compile
}Combinar con la varianza
Las restricciones y la varianza resuelven problemas diferentes: la varianza (in/out) controla las relaciones de subtipos, mientras que las restricciones (límites con : y where) limitan los tipos permitidos. Puede usarlas conjuntamente.
Diseñar buenas restricciones
Añada una restricción solo cuando necesite una capacidad del tipo. Restringir demasiado reduce la reutilización; restringir muy poco obliga a realizar conversiones de tipo. Establezca como límite el tipo más general que proporcione las operaciones que utiliza.
Comprobación rápida
¿Cómo se exige que un parámetro de tipo cumpla más de un límite?
Resumen
Las restricciones genéricas establecen límites superiores con T : Bound (o con where para varios límites), habilitan las operaciones del límite y excluyen los tipos incompatibles. Establecer Any como límite exige que el tipo no sea anulable. Combinadas con la varianza, las restricciones permiten diseñar genéricos seguros y expresivos. Con esto finaliza el curso Generics and Variance.
Preguntas frecuentes
¿La lección «Restricciones de genéricos» es gratis?
Sí — el texto completo de «Restricciones de genéricos» 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 «Restricciones de genéricos»?
Limite los parámetros de tipo 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 4 de 4.
¿Cuánto tiempo toma la lección «Restricciones de genéricos»?
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