在 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>()
这会起作用,因为当函数被内联时,编译器会为它的每个调用点转换它的主体,并且转换包括用具体类型替换具体化的类型参数。
我有这个通用方法:
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>()
这会起作用,因为当函数被内联时,编译器会为它的每个调用点转换它的主体,并且转换包括用具体类型替换具体化的类型参数。