我想创建一个通用函数,该函数允许将上下文强制转换为在参数中传递的活动类型。
想法示例:
private fun <T> castContext(activityType: T): T{
//example activityType = MainActivity
return context as T
}
答案 0 :(得分:3)
为此,您需要提供类型信息,通常仅在编译时可用(由于类型擦除)。在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)
由于Kotlin的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?
作为方法的接收者有些争议,因为使用?.
隐式处理了null而不是在调用站点上显式地处理了null