如何通过反射获取类并为泛型函数传入泛型参数?
问题:通过反射设置Kotlin内联泛型函数的泛型参数
现有如下Kotlin内联泛型函数:
public inline fun <reified W : ListenableWorker> PeriodicWorkRequestBuilder( repeatInterval: Duration ): PeriodicWorkRequest.Builder { return PeriodicWorkRequest.Builder(W::class.java, repeatInterval) }
该函数要求传入泛型参数W,现在需要通过反射获取的Class对象来设置这个泛型参数,以下是尝试的伪代码:
val work = Class.forName("com.demo.work") PeriodicWorkRequestBuilder<work::class>(1, TimeUnit.HOURS).build()
解决方案
因为这个函数是inline + reified泛型,编译时会将泛型类型直接替换为具体类的Class对象,反射获取的Class无法直接作为reified泛型参数传入。直接绕过这个内联函数,调用它内部实际依赖的PeriodicWorkRequest.Builder构造方法即可:
// 反射获取Worker类的Class对象,并强转为ListenableWorker的子类类型 val workClass = Class.forName("com.demo.work") as Class<out ListenableWorker> // 直接调用Builder的构造方法,传入反射得到的Class和间隔时长 val requestBuilder = PeriodicWorkRequest.Builder(workClass, Duration.ofHours(1)) // 构建PeriodicWorkRequest val periodicWork = requestBuilder.build()
说明
- 内联reified泛型函数的本质就是在编译期把
W::class.java替换成具体类的Class实例,既然我们已经通过反射拿到了目标Class,直接调用底层Builder的构造逻辑是最直接的方式,无需再借助原内联函数。 - 必须将反射获取的Class强转为
Class<out ListenableWorker>,否则会出现类型不兼容的编译错误。
内容的提问来源于stack exchange,提问作者SageJustus
相关产品推荐
相关产品推荐

