J'essaie de tester un type générique dans Kotlin.
if (value is Map<String, Any>) { ... }
Mais le compilateur se plaint de
Impossible de vérifier par exemple le type effacé: jet.Map
La vérification avec un type normal fonctionne bien.
if (value is String) { ... }
Kotlin 0.4.68 est utilisé.
Qu'est-ce que j'oublie ici?
Le problème est que les arguments de type sont effacés, vous ne pouvez donc pas vérifier par rapport à la mappe de type complète, car au moment de l'exécution, il n'y a aucune information sur ces chaînes et aucun.
Pour contourner ce problème, utilisez des caractères génériques:
if (value is Map<*, *>) {...}
La machine virtuelle Java supprime les informations de type génériques. Mais Kotlin a réifié les génériques. Si vous avez un type générique T, vous pouvez marquer le paramètre de type T d’une fonction en ligne comme réifié afin qu’il puisse le vérifier au moment de l’exécution.
Alors tu peux faire:
inline fun <reified T> checkType(obj: Object, contract: T) {
if (obj is T) {
// object implements the contract type T
}
}