Чтобы это работало, вам нужно предоставить информацию о типе, обычно доступную только во время компиляции (из-за стирания типа).В 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?
в качестве метода приемник несколько спорен, из-за обработки нуля неявно, вместоявно на сайте вызова, используя ?.