generics - reified - Genéricos de Kotlin
nested classes kotlin (3)
¿Cómo es posible imponer un tipo genérico para un método en Kotlin? Sé que por ejemplo puedes hacer lo siguiente:
var someVar: MutableSet<out SomeType> = hashSetOf()
¿Cómo puedes hacer lo mismo con un método?
fun <T> doSomething() {
}
Me gustaría imponer que T sea del tipo X o un subtipo del mismo.
Gracias.
Después de googlear, la respuesta correcta sería:
fun <T : X> doSomething() {
}
En realidad out SomeType significa más que "tipo de parámetro puede ser SomeType o cualquiera de sus subtipos" como sugiere su pregunta.
La palabra clave out es la forma en que Kotlin dice que, en este ejemplo, MutableSet es un Productor de SomeType , es decir, es covariante en su parámetro de tipo. Como consecuencia, no podrá llamar a métodos como add(t:T) , sino solo a aquellos que devuelven T s, como get():T
De vuelta a su pregunta: si se supone que su método acepta tipos de X o sus subtipos, debe usar "límites":
fun <T : X> doSomething() {
}
Esto es justo lo que necesita, pero para aclararlo de nuevo, no se puede decir que sea el equivalente a su otro ejemplo.
como @ s1m0nw1 citado, puedes usar fun <T : X> doSomething() { }
para limitar el subtipo T de X,
adicional, puede usar la fun <T> doSomething where T : Comparable, T : Cloneable { }
para limitar T debe implementar tanto Comparable como Cloneable
como se menciona aquí https://kotlinlang.org/docs/reference/generics.html