Как сделать универсальную функцию приведения типов для приведения контекста к любому действию? - PullRequest
0 голосов
/ 20 сентября 2019

Я хотел бы создать универсальную функцию, которая позволяет приводить контекст к типу активности, переданному в параметре.

пример идеи:

private fun <T> castContext(activityType: T): T{
  //example activityType = MainActivity
  return context as T
}

1 Ответ

3 голосов
/ 20 сентября 2019

Чтобы это работало, вам нужно предоставить информацию о типе, обычно доступную только во время компиляции (из-за стирания типа).В Java вы должны предоставить экземпляр Class или что-то с именем type token.

1. Если информация о типе доступна во время компиляции, вы можете использовать

private inline fun <reified T: Any> castContext(activity: Any?): T {
  return activity as T
}

Встроенная функцияявляется конструкцией только во время компиляции и, таким образом, может «встраивать» информацию о типе в байт-код в вашем месте (как при передаче его явно в качестве параметра функции) - это делается путем изменения параметра универсального типа.

Выможет дополнительно сузить границы общего параметра от Any до того, что вы хотите специализировать для этой функции для ваших нужд.

2 Если вы хотите привести динамическое приведение к экземпляру некоторого класса, неизвестного во время компиляциивам нужно выполнить обычное приведение:

val type: KClass<*> = ...
type.cast(instance)
type.safeCast(instance)

Поскольку ключевые слова Котлина as и as? не являются методами (что меня раздражает без конца, из-за того, что часто требуется дополнительная () для приведения,Я использую эту пару функций:


/** @return this as instance of the specified type (equivalent to this as T) */
inline fun <reified T: Any> Any?.asIs(): T = this as T

/** @return this as instance of the specified type (equivalent to this as? T) */
inline fun <reified T: Any> Any?.asIf(): T? = this as? T

использование Any? в качестве метода приемник несколько спорен, из-за обработки нуля неявно, вместоявно на сайте вызова, используя ?.

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