从 Moshi 类型适配器的具体泛型类型中获取 ParameterizedType
Get ParameterizedType from reified generic type for Moshi type adapter
给定的断言将因错误而失败
Failed to find the generated JsonAdapter constructor for class GenericType
如何从 Moshi
的具体化类型 T
中获取正确的类型?
GenericType
类型使用 Kotlin 代码生成 Moshi 使用 @JsonClass(generateAdapter = true)
注释,仅使用 Moshi.Builder().build()
.
我可以用
手动生成ParameterizedType
Types.newParameterizedType(GenericType::class.java, String::class.java)
其中 GenericType::class.java
与 T:class.java
一起给出。但是我不知道如何获取 String
类型参数来生成方法。
inline fun <reified T : Any> adapter() =
moshi.adapter<T>(type<T>())
inline fun <reified T : Any> type() =
T::class.java
assert(adapter<GenericType<String>>() != null)
注意适配器可用于任何 GenericType<T>
,只是不适用于没有通用信息的实际 class GenericType::class.java
。
所以下面的genericType
会找到适配器,只要我知道G
:
inline fun <reified G : Any> genericType() =
newParameterizedType(GenericType::class.java, G::class.java)
G
正是我要在 type()
中找到的内容,因为 T::class.java
就在 GenericType::class.java
那里。
我目前正在使用类似于 Gson
的自定义 TypeToken
方法实现我的目标
abstract class TypeToken<T>
inline fun <reified T : Any> type() = object : TypeToken<T>() {}::class
.java
.genericSuperclass
.let { it as ParameterizedType }
.actualTypeArguments
.first()
但我仍然希望找到一种直接从 T
获取 ParameterizedType
的方法。
Kotlin 现在为 return 具体化类型 T
的 KType
提供实验性 typeOf<T>()
函数。所以所需的代码很简单:
inline fun <reified T : Any> type() = typeOf<T>()
给定的断言将因错误而失败
Failed to find the generated JsonAdapter constructor for class GenericType
如何从 Moshi
的具体化类型 T
中获取正确的类型?
GenericType
类型使用 Kotlin 代码生成 Moshi 使用 @JsonClass(generateAdapter = true)
注释,仅使用 Moshi.Builder().build()
.
我可以用
手动生成ParameterizedType
Types.newParameterizedType(GenericType::class.java, String::class.java)
其中 GenericType::class.java
与 T:class.java
一起给出。但是我不知道如何获取 String
类型参数来生成方法。
inline fun <reified T : Any> adapter() =
moshi.adapter<T>(type<T>())
inline fun <reified T : Any> type() =
T::class.java
assert(adapter<GenericType<String>>() != null)
注意适配器可用于任何 GenericType<T>
,只是不适用于没有通用信息的实际 class GenericType::class.java
。
所以下面的genericType
会找到适配器,只要我知道G
:
inline fun <reified G : Any> genericType() =
newParameterizedType(GenericType::class.java, G::class.java)
G
正是我要在 type()
中找到的内容,因为 T::class.java
就在 GenericType::class.java
那里。
我目前正在使用类似于 Gson
的自定义TypeToken
方法实现我的目标
abstract class TypeToken<T>
inline fun <reified T : Any> type() = object : TypeToken<T>() {}::class
.java
.genericSuperclass
.let { it as ParameterizedType }
.actualTypeArguments
.first()
但我仍然希望找到一种直接从 T
获取 ParameterizedType
的方法。
Kotlin 现在为 return 具体化类型 T
的 KType
提供实验性 typeOf<T>()
函数。所以所需的代码很简单:
inline fun <reified T : Any> type() = typeOf<T>()