在Kotlin中获取通用类型的T.

时间:2018-03-28 14:11:25

标签: generics kotlin typetoken

我有这种通用方法:

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正在返回&#34; T&#34;对我来说,而不是传递的类的类型。

有没有办法让类型传递为&#34; T&#34;?

1 个答案:

答案 0 :(得分:2)

由于Deserializer主体仅编译一次,因此编译器不能为object : TypeToken<T>() {}创建不同的类,使用不同的具体类型替换类型参数T(因此它只留下T虽然这是条件,但这个条件对于TypeToken工作的泛型具体化至关重要。

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

您可以通过向TypeToken的构造函数添加Deserializer参数并使用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>()

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