首页 > 解决方案 > 在没有 reified 关键字的 Kotlin 中获取泛型类型参数的运行时类

问题描述

Kotlin 提供了一种使用关键字获取泛型类型参数的运行时类的方法,该reified关键字只能与inline函数一起使用。例如以下作品:

inline fun <reified T> test() : T {
  println(T::class.java)
}

但是,我需要一种在非内联函数中执行此操作的方法。由于reified关键字不是非内联函数的选项,因此以下内容不起作用:

fun <reified T> test() : T {
  println(T::class.java)
}

Kotlin 是否有不同的方法来解决这个问题?我知道将 theClass<T>作为参数可能是一种解决方案,但我不想为此目的向我的函数传递额外的参数。

标签: genericsreflectionkotlininline

解决方案


一个有点棘手的解决方案:

inline fun <reified T> test() : T = testImpl(T::class.java)
private fun <T> testImpl(`class`: Class<T>) : T {
  println(`class`)
  // do something
}

在此解决方案中,您实际上是在传递一个Class实例,但不是直接进行。您的调用代码可能看起来像test<Xxx>().
如果Toftest可以推断出来,就可以test()直接使用了,泛型参数还是正确传递的。


推荐阅读