0

假设我们有一个接口,它通过将数据序列化为 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 来获取类型。

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

4

1 回答 1

1

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

更糟糕的是 aKClass不能保存类型参数,所以如果你的具体化参数是一个List<Something>例子,那么你已经在那里丢失了信息 - 另一个不回到具体化的原因。

可悲的结论是,您可能不得不处理KClass这样的情况。

于 2020-04-28T09:00:50.590 回答