Я пытаюсь написать общую функцию, которая считывает строку json из файла и анализирует ее на ожидаемый объект. Ожидаемый объект - это класс данных.

fun <T: Any> read(fileName: String, type: KClass<T>): T? {
    val file = File(fileName)
    if(!file.exists()) {
        return null
    }
    val str = file.readText()
    val data = Gson().fromJson<T>(str, type::class.java)
    return data
}

Он работает до тех пор, пока не будет выполнен синтаксический анализ json, который, к сожалению, не создает объект типа class kotlin.reflect.jvm.internal.KClassImpl.

Я ожидал ответа

val data = Gson().fromJson<T>(str, type::class.java)

Быть T. Как получить возвращаемый объект типа T?

При попытке запустить указанную выше функцию выдается следующее исключение:

java.lang.ClassCastException: kotlin.jvm.internal.ClassReference cannot be cast to my.app.Models.DemoModel
1
Daniel 27 Фев 2021 в 21:37

1 ответ

Лучший ответ

Вам необходимо заменить ::class.java на .java. Как вариант, вы можете переписать его так:

inline fun <reified T: Any> read(fileName: String): T? {
    val file = File(fileName)
    if(!file.exists()) {
        return null
    }
    val str = file.readText()
    val data = Gson().fromJson<T>(str, T::class.java)
    return data
}
1
Konstantin Raspopov 27 Фев 2021 в 18:57