我有这种通用方法:
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;?
答案 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>()
这将起作用,因为当内联函数时,编译器会为其每个调用站点转换其主体,并且转换包括用具体类型替换具体类型参数。