如何获取泛型类的类型并将其强制转换为对象?
我想使用此函数来传递Interface类:
protected fun <T> getInteraction(): T {
return when {
context is T -> context
parentFragment is T -> parentFragment as T
else -> throw IllegalArgumentException("not implemented interaction")
}
}
并像这样使用它:
private var interaction: ISigninInteraction? = null
override fun onAttach(context: Context?) {
super.onAttach(context)
interaction = getInteraction<ISigninInteraction>()
}
答案 0 :(得分:2)
当实现泛型时,Kotlin,Java和JVM确实具有擦除类型。泛型在字节码级别不可见。这意味着您不能使用类型参数,例如T
,直接在功能代码中。
Kotlin添加了对reified
泛型的支持,这在这里很有帮助。您可以将函数声明为
inline fun <reified T> getIt() : T {
...
}
借助reified
和inline
,可以转换为T
并返回它。
https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters
第二种选择是遵循Java惯例-将Class<T>
参数添加到函数中,并使用Class#cast
强制转换为T
。
您可以将reified inline
函数与以下方法结合使用:
inline fun <reified T> getIt() = getIt(T::class.java)