【问题标题】:How to pass a reified parameter to some other function when current function can't be inline (but we have Reflections)?当当前函数不能内联(但我们有反射)时,如何将具体参数传递给其他函数?
【发布时间】:2020-08-12 00:26:33
【问题描述】:

假设我们有一个接口,它通过将数据序列化为 json 来定义某个数据库中的数据存储。

interface StorageApi {
    suspend fun store(key: String, value: Any)
    // inline suspend fun <reified T: Any> get(key: String): T // reification is not possible in interfaces since we can't inline them
    suspend fun <T: Any> get(key: String, kClass: KClass<T>): T // so I have to stick with some other way, like reflection.
}

然后我们有一个方法的实现:

override suspend fun <T : Any> get(key: String, kClass: KClass<T>): T {
    val value = // some query to database
    return Klaxon().parse<T>(value) // obviously error by compiler since T goes through type-erasure
}

在这里我不能使用 T,因为它会在运行时通过类型擦除。我有反思,但不知道如何在此目的中使用它。 Klaxon.parse() 函数不接受 KClass 来获取类型。

有没有什么办法可以绕过这些或制作一些实用程序来为此目的使用反射,或任何其他可能的解决方法?

【问题讨论】:

    标签: generics kotlin reflection klaxon kotlin-reified-type-parameters


    【解决方案1】:

    我相当确定,如果您在任何时候中断内联具体化链,并开始使用类(即KClass 实例),不幸的是,由于您所描述的原因,没有回头路可走。

    更糟糕的是KClass 不能保存类型参数,所以如果你的具体化参数是List&lt;Something&gt;,那么你已经丢失了那里的信息——另一个不回到具体化的原因。

    可悲的结论是,在这种情况下,您可能不得不处理KClass

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 2011-01-19
      • 2018-05-22
      • 2016-01-13
      • 2020-01-26
      • 2020-03-04
      • 1970-01-01
      • 2022-01-10
      • 2014-06-04
      相关资源
      最近更新 更多