Comment le réifiée mot-clé dans Kotlin travail?
J'essaie de comprendre le but de la reified
mot-clé, apparemment c'est ce qui nous permet de faire une réflexion sur les médicaments génériques.
Cependant, quand je le laisse sortir, il fonctionne tout aussi bien. Quelqu'un veut bien expliquer quand cela fait un réel différence?
- Êtes-vous sûr de savoir ce que la réflexion est? Aussi, avez-vous entendu parler du type de l'effacement?
- Paramètres de type générique sont effacés au moment de l'exécution, de lire sur le type d'effacement si vous ne l'avez pas déjà. Réifiée paramètres de type inline sur des fonctions non seulement inline le corps de la méthode, mais aussi la paramètre de type générique vous permettant de vous faire des choses comme T::class.java (vous ne pouvez pas faire avec la normale types génériques). Mettre un commentaire parce que je n'ai pas le temps de donner de la chair une réponse complète en ce moment..
- Il permet d'obtenir l'accès pour le béton de type générique d'une fonction sans compter sur la réflexion et sans avoir à passer le type de l'argument.
Vous devez vous connecter pour publier un commentaire.
TL;DR: qu'est-Ce que
reified
bon pourDans le corps d'une fonction générique comme
myGenericFun
, vous ne pouvez pas accéder au typeT
parce que c'est uniquement disponible au moment de la compilation mais effacé au moment de l'exécution. Par conséquent, si vous souhaitez utiliser le type générique comme une classe normale dans le corps de la fonction, vous devez transmettre explicitement la classe comme un paramètre comme indiqué dansmyGenericFun
.Si vous créez un
inline
fonction avec un réifiéeT
cependant, le type deT
peut être consulté, même au moment de l'exécution et vous n'avez donc pas besoin de passer leClass<T>
de plus. Vous pouvez travailler avecT
comme si c'était une classe normale, par exemple, vous pourriez vouloir vérifier si une variable est un instance deT
, que vous pouvez facilement le faire alors:myVar is T
.Une
inline
fonction avecreified
typeT
se présente comme suit:Comment
reified
œuvresVous ne pouvez utiliser
reified
en combinaison avec uninline
function. Une telle fonction, le compilateur copier la fonction du bytecode à chaque endroit où la fonction (la fonction "inline").Lorsque vous appelez une fonction inline avec réifiée type, la compilateur sait le type réel utilisé comme un argument de type et modifie le bytecode généré à l'usage de la catégorie correspondante directement.
Par conséquent, les appels de ce genre
myVar is T
devenirmyVar is String
(si l'argument de type ont étéString
) dans le bytecode et au moment de l'exécution.Exemple
Jetons un coup d'oeil à un exemple qui montre comment utile
reified
peut être.Nous voulons créer une fonction d'extension pour
String
appelétoKotlinObject
qui essaie de convertir une chaîne JSON à une plaine Kotlin objet avec un type spécifié par la fonction est de type génériqueT
. Nous pouvons utilisercom.fasterxml.jackson.le module.kotlin
pour cette et la première démarche est la suivante:a) Première approche sans réifiée type
La
readValue
méthode prend un type qu'il est censé analyser lesJsonObject
pour. Si nous essayons d'obtenir leClass
du paramètre de typeT
, le compilateur se plaint: "Impossible d'utiliser le" T " comme réifiée paramètre de type. Utiliser une classe à la place."b) Solution explicite
Class
paramètreComme une solution de contournement, la
Class
deT
peut être faite d'un paramètre de méthode, qui est ensuite utilisé comme un argument pourreadValue
. C'est un modèle courant dans les génériques de code Java. Il peut être appelé comme suit:c) La Kotlin façon:
reified
À l'aide d'un
inline
fonction avecreified
paramètre de typeT
rend possible la mise en œuvre différemment la fonction:Il n'y a pas besoin de prendre le
Class
deT
en outre,T
peut être utilisé comme si c'était une classe ordinaire. Pour le client, le code ressemble à ceci:Remarque importante: Travailler avec Java
Une fonction inline avec
reified
type est pas appelable à partir de Java code.