You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射获取类并为泛型函数传入泛型参数?

问题:通过反射设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:10:35