在 Kotlin 中获取 T 的通用类型

Get generic type of T in Kotlin

我有这个通用方法:

class Deserializer<T : Any> : ResponseDeserializable<T> {
    override fun deserialize(reader: Reader): T? {
        val type =  object: TypeToken<T>() {}.type
        return Gson().fromJson(reader, type)
    }
}

但是 val type = object: TypeToken<T>() {}.type 返回 "T" 给我,而不是 class 通过的类型。

有没有办法让 class 的类型作为 "T" 传递?

由于 Deserializer 主体仅编译一次,编译器无法为 object : TypeToken<T>() {} 创建不同的 类 并用不同的具体类型替换类型参数 T(因此它只保留 T 原样),而此条件对于 TypeToken 的泛型具体化工作至关重要。

您只能使用 TypeToken 获取具体类型,其中具体类型存在于源代码 inline 函数中 reified类型参数。

您可以通过向 Deserializer 的构造函数添加 TypeToken 参数并使用 inline 工厂函数来修复您的代码:

class Deserializer<T : Any>(
    val typeToken: TypeToken<T>
) : ResponseDeserializable<T> {

    override fun deserialize(reader: Reader): T? {
        val type = typeToken.type
        return Gson().fromJson(reader, type)
    }
}

inline fun <reified T> deserializerOf(): Deserializer<T> = 
    Deserializer(object : TypeToken<T>() {})

用法示例:

val deserializer = deserializerOf<MyType>()

这会起作用,因为当函数被内联时,编译器会为它的每个调用点转换它的主体,并且转换包括用具体类型替换具体化的类型参数。