gpt4 book ai didi

generics - 获取Kotlin中T的通用类型

转载 作者:行者123 更新时间:2023-12-02 13:14:17 26 4
gpt4 key购买 nike

我有这种通用方法:

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”,而不是传递的类的类型。

有没有一种方法可以将类的类型传递为“T”?

最佳答案

由于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>()

之所以会这样工作是因为,当内联函数时,编译器会为其每个调用站点转换其主体,并且转换过程包括用具体类型替换化类型参数。

关于generics - 获取Kotlin中T的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49536841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com