让我们假设我们有一个接口,它通过将数据序列化为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。
有没有办法绕过这些,或者制作一些实用工具来使用反射来达到这个目的,或者任何其他可能的变通方法?
发布于 2020-04-28 17:00:51
我非常确定,如果您在任何时候打破内联具体化链,并开始使用类(即KClass实例),不幸的是,由于您所描述的原因,将无法回头。
更糟糕的是,KClass不能保存类型参数,所以如果你的实例化参数是一个List<Something>,那么你已经丢失了那里的信息--这是不能回到实例化的另一个原因。
可悲的结论是,在这种情况下,您可能必须处理KClass。
https://stackoverflow.com/questions/61475997
复制相似问题