web-dev-qa-db-fra.com

Comment puis-je vérifier le type générique dans Kotlin

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?

32
Philipp Brüll

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<*, *>) {...}
54
Andrey Breslav

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
  }
}
1
menno