Kotlin
Genéricos
Buscar..
Introducción
Una lista puede contener números, palabras o realmente cualquier cosa. Por eso llamamos a la lista genérica .
Los genéricos se usan básicamente para definir qué tipos puede contener una clase y qué tipo tiene un objeto actualmente.
Sintaxis
- clase ClassName < TypeName >
- clase ClassName <*>
- ClassName <en UpperBound >
- ClassName <out LowerBound >
- Nombre de la clase < TypeName : UpperBound >
Parámetros
Parámetro | Detalles |
---|---|
Escribe un nombre | Tipo Nombre del parámetro genérico |
UpperBound | Tipo Covariante |
Límite inferior | Tipo Contravariante |
Nombre de la clase | Nombre de la clase |
Observaciones
El límite superior implícito es anulable
En Kotlin Generics, el límite superior del tipo de parámetro T
sería Any?
. Por lo tanto para esta clase:
class Consumer<T>
El parámetro de tipo T
es realmente T: Any?
. Para hacer un límite superior no anulable, explícitamente específico T: Any
. Por ejemplo:
class Consumer<T: Any>
Variación del sitio de la declaración
La variación del sitio de la declaración se puede considerar como una declaración de la variación del sitio de uso de una vez por todas.
class Consumer<in T> { fun consume(t: T) { ... } }
fun charSequencesConsumer() : Consumer<CharSequence>() = ...
val stringConsumer : Consumer<String> = charSequenceConsumer() // OK since in-projection
val anyConsumer : Consumer<Any> = charSequenceConsumer() // Error, Any cannot be passed
val outConsumer : Consumer<out CharSequence> = ... // Error, T is `in`-parameter
Los ejemplos generalizados de varianza del sitio de declaración son List<out T>
, que es inmutable, de modo que T
solo aparece como el tipo de valor de retorno, y Comparator<in T>
, que solo recibe T
como argumento.
Varianza del sitio de uso
La varianza del sitio de uso es similar a los comodines de Java:
Out-proyección:
val takeList : MutableList<out SomeType> = ... // Java: List<? extends SomeType>
val takenValue : SomeType = takeList[0] // OK, since upper bound is SomeType
takeList.add(takenValue) // Error, lower bound for generic is not specified
En proyección:
val putList : MutableList<in SomeType> = ... // Java: List<? super SomeType>
val valueToPut : SomeType = ...
putList.add(valueToPut) // OK, since lower bound is SomeType
putList[0] // This expression has type Any, since no upper bound is specified
Proyección de estrellas
val starList : MutableList<*> = ... // Java: List<?>
starList[0] // This expression has type Any, since no upper bound is specified
starList.add(someValue) // Error, lower bound for generic is not specified
Ver también:
Variante de interoperabilidad de genéricos al llamar a Kotlin desde Java.