Предположим, у нас есть интерфейс, который определяет хранение данных в некоторой базе данных путем сериализации их в 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, как это было бы go через стирание типа во время выполнения. У меня есть размышления, но я не знаю, как использовать это в этой цели. Функция Klaxon.parse()
не принимает KClass для получения типов.
Есть ли способ обойти их или использовать какую-либо утилиту для использования отражения в этой цели или любые другие возможные обходные пути?