如何使泛型Type转换功能将上下文转换为Any活动?

时间:2019-09-20 11:20:04

标签: android kotlin

我想创建一个通用函数,该函数允许将上下文强制转换为在参数中传递的活动类型。

想法示例:

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

1 个答案:

答案 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的asas?关键字不是方法(这使我无休止,因为经常需要额外的()进行强制转换,因此我使用了这对函数:


/** @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