Как передать параметр reified другой функции, когда текущая функция не может быть встроенной (но у нас есть Reflections)? - PullRequest
0 голосов
/ 28 апреля 2020

Предположим, у нас есть интерфейс, который определяет хранение данных в некоторой базе данных путем сериализации их в 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 для получения типов.

Есть ли способ обойти их или использовать какую-либо утилиту для использования отражения в этой цели или любые другие возможные обходные пути?

1 Ответ

1 голос
/ 28 апреля 2020

Я совершенно уверен, что если вы в любой момент разорвете встроенную цепочку реификации и начнете работать с классами (то есть KClass экземплярами), то, к сожалению, пути назад не будет, именно по тем причинам, которые вы описали.

Что еще хуже, KClass не может содержать параметры типа, поэтому, если ваш параметр reified был, например, List<Something>, то вы уже потеряли информацию - еще одна причина, по которой вы не возвращаетесь к овеществлению.

Печальный вывод: вам, вероятно, придется иметь дело с KClass в таком случае.

...