Подтвердить что ты не робот

Как проверить общий тип в Kotlin

Я пытаюсь проверить общий тип в Kotlin.

if (value is Map<String, Any>) { ... }

Но компилятор жалуется на

Невозможно проверить экземпляр стираемого типа: jet.Map

Проверка с обычным типом работает хорошо.

if (value is String) { ... }

Используется Kotlin 0.4.68.

Что мне здесь не хватает?

4b9b3361

Ответ 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
  }
}