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