Как проверить общий тип в Kotlin
Я пытаюсь проверить общий тип в Kotlin.
if (value is Map<String, Any>) { ... }
Но компилятор жалуется на
Невозможно проверить экземпляр стираемого типа: jet.Map
Проверка с обычным типом работает хорошо.
if (value is String) { ... }
Используется Kotlin 0.4.68.
Что мне здесь не хватает?
Ответы
Ответ 1
Проблема заключается в том, что аргументы типа стираются, поэтому вы не можете проверять полную карту типов, потому что во время выполнения нет информации об этих String и Any.
Чтобы обойти это, используйте подстановочные знаки:
if (value is Map<*, *>) {...}
Ответ 2
JVM удаляет информацию общего типа. Но у Котлина были усовершенствованные дженерики. Если у вас есть универсальный тип T, вы можете пометить параметр типа T встроенной функции как расширенный, чтобы он мог проверить его во время выполнения.
Так что вы можете сделать:
inline fun <reified T> checkType(obj: Object, contract: T) {
if (obj is T) {
// object implements the contract type T
}
}