Comment utiliser TypeToken + génériques avec Gson dans Kotlin
Je ne suis pas en mesure d'obtenir une Liste de type générique d'une classe personnalisée (Tours):
val turnsType = TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson(pref.turns, turnsType)
il dit:
cannot access '<init>' it is 'public /*package*/' in 'TypeToken'
Vous devez vous connecter pour publier un commentaire.
Créer cette inline plaisir:
et puis vous pouvez l'appeler de cette façon:
NOTE: Cette approche n'était pas possible avant dans le vieux kotlin versions plugin mais maintenant vous êtes en mesure de l'utiliser.
Variantes Précédentes:
VARIANTE 1:
Vous devez mettre
object :
et le type spécifique defromJson<List<Turns>>
VARIANTE 2:
Comme @cypressious dire elle peut être également réalisée de cette façon:
utiliser comme:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Cela résout le problème:
La première ligne crée un l'objet de l'expression qui descend de
TypeToken
et obtient ensuite le JavaType
de que. Puis leGson().fromJson
méthode ou les besoins du type spécifié pour le résultat de la fonction (qui doit correspondre à laTypeToken
créé). Deux versions de cette œuvre, comme ci-dessus ou:Pour le rendre plus facile pour créer le
TypeToken
vous pouvez créer une fonction d'assistance, qui est nécessaire pour être inline afin qu'il puisse utiliser réifiée paramètres de type:Qui peut ensuite être utilisé dans l'une de ces façons:
Et l'ensemble du processus peut être enveloppé dans une fonction d'extension pour le
Gson
exemple:De sorte que vous pouvez les appeler Gson et ne pas vous soucier de
TypeToken
à tous:Ici Kotlin est l'aide de l'inférence de type, d'un côté de la cession ou de l'autre, et réifié génériques pour une fonction en ligne pour passer à travers le type complet (sans effacement), et en utilisant que pour construire un
TypeToken
et aussi faire l'appel à GsonGson().fromJson<kotlin.List<Turns>>(pref.turns)
Gson()
ou tout simplementGson
comme-si elle est statique? Vous avez besoin de la première, une instance.Une autre option (pas sûr, c'est plus élégant que les autres) pourrait être un appel comme ceci:
De sorte que vous êtes en utilisant le java de la classe Array un liner à la place de "pure Kotlin".
C'est ma façon à l'analyse des données de tableau dans kotlin.
Cela fonctionne aussi bien, et est plus simple
J'ai utilisé quelque chose comme cela pour convertir
T
àstring
&String
retour àT
à l'aide deGson
. Pas exactement ce que vous cherchez, mais juste au cas où.