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:



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow