Kotlin
Génériques
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.