首页 > 解决方案 > Kotlin 通用函数响应

问题描述

我正在尝试编写一个通用函数,它从文件中读取一个 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

标签: androidkotlingenerics

解决方案


您需要替换::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
}

推荐阅读