在Kotlin中获取泛型类型参数的运行时类,而不使用具体的关键字

时间:2018-05-02 17:27:40

标签: generics reflection kotlin inline

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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>() 如果可以推断出T test,则可以直接使用test(),并且仍然可以正确传递通用参数。