bei*_*rad 2 generics android interface fragment kotlin
如何获取泛型类的类型并将对象转换为它?
我想使用这个函数来传递一个 Interface 类:
protected fun <T> getInteraction(): T {
return when {
context is T -> context
parentFragment is T -> parentFragment as T
else -> throw IllegalArgumentException("not implemented interaction")
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
private var interaction: ISigninInteraction? = null
override fun onAttach(context: Context?) {
super.onAttach(context)
interaction = getInteraction<ISigninInteraction>()
}
Run Code Online (Sandbox Code Playgroud)
Kotlin、Java 和 JVM 在实现泛型时确实会进行类型擦除。泛型在字节码级别不可见。T这意味着,您不能直接在函数代码中使用类型参数,例如。
Kotlin 添加了对reified泛型的支持,这对此很有帮助。您可以像这样声明函数
inline fun <reified T> getIt() : T {
...
}
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4589 次 |
| 最近记录: |