假设我们有一个接口,它通过将数据序列化为 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 来获取类型。
有没有办法绕过这些或制作一些实用程序来为此目的使用反射,或任何其他可能的解决方法?