【发布时间】: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