Проверьте, является ли переданный параметр типом класса - PullRequest
1 голос
/ 09 января 2020

Я хочу вызвать следующую функцию:

fun <T> isCurrentActivity( t: Class<T>): Boolean {
    return (currentActivity != null) &&  (currentActivity is t)
}

if (isCurrentActivity(MainActivity::class.java)) {

}

Но это неразрешенная ссылка. Как я могу это исправить? Я не могу использовать встроенную функцию reified, потому что функция должна быть общедоступной.

1 Ответ

1 голос
/ 09 января 2020

Проблема в том, что 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, так как действительно хороший способ проверить тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...