Zoeken…


Invoering

Een lijst kan cijfers, woorden of echt alles bevatten. Daarom noemen we de Lijst generiek .

Generieken worden in principe gebruikt om te bepalen welke typen een klasse kan bevatten en welk type een object momenteel bevat.

Syntaxis

  • class ClassName < TypeName >
  • class ClassName <*>
  • ClassName <in UpperBound >
  • ClassName <uit LowerBound >
  • class Name < TypeName : UpperBound >

parameters

Parameter Details
TypeName Type Naam van generieke parameter
Bovengrensconcentraties Covariant Type
benedengrens Contravariant type
Naam van de klasse Naam van de klas

Opmerkingen

Impliciet Upper Bound is Nullable

In Kotlin Generics is de bovengrens van typeparameter T Any? . Daarom voor deze klasse:

class Consumer<T>

De parameter type T is echt T: Any? . Om een niet-nulbare bovengrens te maken, expliciet specifiek T: Any . Bijvoorbeeld:

class Consumer<T: Any>

Declaratie-site variantie

Declaratie-site variantie kan worden beschouwd als een verklaring van gebruik-site variantie voor eens en altijd voor alle gebruik-sites.

  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

Veel voorkomende voorbeelden van de variantie van de declaratie-site zijn List<out T> , die onveranderlijk is zodat T alleen als het retourwaardetype verschijnt, en Comparator<in T> , die alleen T als argument ontvangt.

Gebruik-site variantie

De variantie van de gebruikssite is vergelijkbaar met Java-jokertekens:

Out-projectie:

  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

In projectie:

  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

Star-projectie

  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

Zie ook:



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow