首页 > 解决方案 > 从 Moshi 类型适配器的具体泛型类型中获取 ParameterizedType

问题描述

给定的断言将由于错误而失败

找不到为类 GenericType 生成的 JsonAdapter 构造函数

如何从 reified 类型T中获得正确的类型Moshi

GenericType类型使用Moshi@JsonClass(generateAdapter = true)Kotlin代码生成进行注释,仅使用.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)

请注意,适配器可用于 any ,但不适用于没有通用信息GenericType<T>的实际类。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那里一样。

标签: androidgenericskotlinmoshikotlin-reified-type-parameters

解决方案


我现在正在使用TypeToken类似于Gson的自定义方法来实现我的目标

abstract class TypeToken<T>

inline fun <reified T : Any> type() = object : TypeToken<T>() {}::class
      .java
      .genericSuperclass
      .let { it as ParameterizedType }
      .actualTypeArguments
      .first()

但我仍然希望找到一种直接获取ParameterizedTypefrom的方法T


推荐阅读