如何将带泛型的内联functionA包装为可Mock的非内联函数?
Kotlin内联函数包装的类型传递解决方案
针对你遇到的内联函数无法Mock、需要包装成非内联函数但不知道传递类型参数的问题,直接用类型强转就能解决,代码实现如下:
fun <T> functionAWrap(string: String, clazz: Class<T>): T { // 调用原内联函数时指定Any类型,再用传入的Class对象强转为目标类型T return clazz.cast(functionA<Any>(string)) }
这样写的逻辑很清晰:原内联函数functionA<Any>会返回任意类型的实例,通过clazz.cast()方法可以安全地将其转换为你传入的clazz对应的类型T,完全适配你期望的调用方式:
functionAWrap(testString, AClass::class.java)
如果原functionA的内部实现依赖更具体的类型信息,也可以借助Kotlin反射来传递类型:
import kotlin.reflect.KClass import kotlin.reflect.full.createType fun <T> functionAWrap(string: String, clazz: Class<T>): T { val kClass: KClass<T> = clazz.kotlin // 利用KClass创建类型信息,传递给原函数(如果原函数支持的话) return functionA(string, type = kClass.createType()) }
不过这种写法需要原functionA支持接收类型参数,要是原函数只依赖reified T的编译期类型信息,第一种强转的写法就足够简洁好用。
内容的提问来源于stack exchange,提问作者meepooooo
相关产品推荐
相关产品推荐

