Проблема в том, что JVM удаляет тип generi c, поэтому тип параметра T недоступен во время выполнения.
Именно поэтому в Java популярный шаблон передает экземпляр Class<T>
как пары. Это не требуется в Kotlin, потому что в Kotlin мы можем определить reified
тип, и этот тип доступен во время выполнения.
Пример:
inline fun <reified T> isCurrentActivity(): Boolean {
return (currentActivity != null) && (currentActivity is T)
}
fun example() {
if (isCurrentActivity<MainActivity>()) {
// it is!
}
}
Требования к маркировке T
as reified
помечает функцию как inline
. См. Больше в документации: https://kotlinlang.org/docs/reference/inline-functions.html#reified -type-parameters
Пример выше - это "kotlin способ сделать это". Если вы хотите остаться с "java like code", вы делаете ошибку, пытаясь проверить, является ли currentActivity
экземпляром переменной - что невозможно. Правильный путь будет таким:
fun <T> isCurrentActivity(t: Class<T>): Boolean {
return (currentActivity != null) && currentActivity.javaClass == t
}
Пожалуйста, смотрите комментарий @gidds о проверке выше.
Но я все же рекомендую использовать параметр типа reified
, так как действительно хороший способ проверить тип.