如何在Fragment列表中根据传入的类型查找对应的Fragment实例?
错误原因
- 你当前定义的函数参数是
Fragment实例类型,而非类类型,直接传入MyFragment类名本身就不符合参数定义要求 - Kotlin 中
is运算符后必须跟随编译期可确定的类型,不能跟变量,所以it is findFragment的写法本身不合法
最优实现方案(推荐)
用Kotlin内联函数+具体化泛型(reified)实现,无需手动传类参数,调用更简洁,自动完成类型转换:
// 内联+reified泛型限定 private inline fun <reified T : Fragment> findFragment(): T? { // 直接用系统提供的filterIsInstance过滤对应类型的实例 return fragments.filterIsInstance<T>().firstOrNull() }
调用方式:
val myFragment = findFragment<MyFragment>() // 返回值就是MyFragment类型,找不到返回null
传类参数的实现方案
如果有动态传入类型的需求,可以传KClass作为参数:
import kotlin.reflect.KClass private fun <T : Fragment> findFragment(fragmentClass: KClass<T>): T? { fragments.forEach { if (fragmentClass.isInstance(it)) { @Suppress("UNCHECKED_CAST") return it as T } } return null }
调用方式:
val myFragment = findFragment(MyFragment::class)
注意
如果你能确定列表中一定存在对应类型的实例,可以把返回值改为非空类型,把firstOrNull()换成first(),或者找不到时抛出异常,否则建议保留可空类型避免崩溃。
内容的提问来源于stack exchange,提问作者Joakim Sjöstedt
相关产品推荐
相关产品推荐

