Kotlin:如何在泛型类中调用带具体化类型参数的内联泛型方法
解决无法调用库中reified泛型内联函数的问题
你遇到的问题是:带非reified泛型参数的Test<T>类,无法调用库类Other中的inline fun <reified K> bar()——编译报错提示不能用T作为reified类型参数,原因是类级泛型T会被泛型擦除,编译时无法获取它的具体类型信息,而bar()作为reified内联函数,必须在编译时确定类型。
因为Other是无法修改的库类,可通过以下两种方式解决:
方案一:将泛型参数移到函数级别并声明为reified
如果Test类不需要保留类级泛型,把泛型参数移到foo函数上,同时将函数声明为inline并标记泛型为reified,就能直接传递类型给bar():
class Test { inline fun <reified T> foo() { val o = Other() o.bar<T>() // 编译正常 } } class Other { inline fun <reified K> bar() { val list = listOf<K>() } } // 使用示例 val test = Test() test.foo<String>() // 指定具体类型调用
方案二:保留类级泛型,通过KClass传递类型信息
如果必须保持Test<T>的类级泛型,需要在创建Test实例时传入T的KClass类型令牌,再通过辅助inline函数调用bar():
1. 修改Test类,添加KClass构造参数
import kotlin.reflect.KClass class Test<T>(private val type: KClass<T>) { fun foo() { val o = Other() o.barWithClass(type) } }
2. 编写辅助扩展函数
为Other类编写inline扩展函数,接收KClass并调用原bar()方法:
inline fun <reified K> Other.barWithClass(clazz: KClass<K>) { this.bar<K>() }
使用示例
val test = Test(String::class) test.foo()
内容的提问来源于stack exchange,提问作者sujith
相关产品推荐
相关产品推荐

