type reified parameter fun example create classes generics kotlin

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