【问题标题】:Get runtime class of a generic type parameter in Kotlin without reified keyword在没有 reified 关键字的 Kotlin 中获取泛型类型参数的运行时类
【发布时间】:2018-05-02 17:27:40
【问题描述】:

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&lt;T&gt; 作为参数可能是一种解决方案,但我不想为此向我的函数传递额外的参数。

【问题讨论】:

    标签: generics reflection kotlin inline


    【解决方案1】:

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

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

    在此解决方案中,您实际上是在传递一个 Class 实例,但您并没有直接这样做。您的调用代码可能类似于test&lt;Xxx&gt;()
    如果testT可以推断出来,那么可以直接使用test(),泛型参数还是可以正确传递的。

    【讨论】:

    • 这个解决方案还需要一个我不想使用的内联函数。
    • 但这只是一个前锋。考虑到您的情况(未通过inline,未通过Class&lt;T&gt;),除了创建内联转发函数外,我想不出任何其他解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多