Recherche…


Introduction

Une liste peut contenir des nombres, des mots ou n'importe quoi. C'est pourquoi nous appelons la liste générique .

Les génériques sont essentiellement utilisés pour définir les types pouvant être conservés par une classe et le type actuellement occupé par un objet.

Syntaxe

  • class ClassName < TypeName >
  • class ClassName <*>
  • ClassName <dans UpperBound >
  • ClassName <out LowerBound >
  • Nom de classe <TypeName: UpperBound>

Paramètres

Paramètre Détails
TypeName Type Nom du paramètre générique
UpperBound Type de covariant
Borne inférieure Type Contravariant
Nom du cours Nom de la classe

Remarques

La limite supérieure implicite est Nullable

Dans Kotlin Generics, la limite supérieure du type de paramètre T serait Any? . Par conséquent pour cette classe:

class Consumer<T>

Le paramètre de type T est vraiment T: Any? . Pour rendre une limite supérieure non nullable, explicitement spécifique T: Any . Par exemple:

class Consumer<T: Any>

Variance du site de déclaration

La variance du site de déclaration peut être considérée comme une déclaration de la variance du site d’utilisation une fois pour tous les sites d’utilisation.

  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

Les exemples les plus répandus de la variance des sites de déclaration sont List<out T> , qui est immuable de sorte que T n'apparaît que comme type de valeur de retour, et Comparator<in T> , qui ne reçoit que T en argument.

Variance du site d'utilisation

La variance du site d'utilisation est similaire aux caractères génériques Java:

Projection:

  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 projection:

  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

Projection étoile

  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

Voir également:

  • Interopérabilité Variant Generics lors de l’appel de Kotlin à partir de Java.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow