【问题标题】:Get ParameterizedType from reified generic type for Moshi type adapter从 Moshi 类型适配器的具体泛型类型中获取 ParameterizedType
【发布时间】:2019-08-21 07:39:52
【问题描述】:

给定的断言将因错误而失败

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

我如何从T 的具体类型Moshi 中获得正确的类型?

GenericType 类型使用 Kotlin 代码生成 @JsonClass(generateAdapter = true) 注释,Moshi 仅使用 Moshi.Builder().build()

我可以手动生成ParameterizedType

Types.newParameterizedType(GenericType::class.java, String::class.java)

其中GenericType::class.javaT: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&lt;T&gt;,只是不适用于没有通用信息的实际类GenericType::class.java

所以只要我知道G,下面的genericType 就会找到一个适配器:

inline fun <reified G : Any> genericType() =
    newParameterizedType(GenericType::class.java, G::class.java)

这个G 是我想在type() 中找到的,因为T::class.java 就是GenericType::class.java 那里。

【问题讨论】:

  • 导致崩溃的实际代码是什么?可以加一下吗?
  • 这是adapter&lt;GenericType&lt;String&gt;&gt;() 中的一个问题,使用@JsonClass(generateAdapter = true)Kotlin 代码生成的基本Moshi 配置。

标签: android generics kotlin moshi kotlin-reified-type-parameters


【解决方案1】:

我现在正在使用类似于 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 的方法。

【讨论】:

    【解决方案2】:

    Kotlin 现在提供了一个实验性的typeOf&lt;T&gt;() 函数来返回具体化类型TKType。所以所需的代码很简单:

    inline fun <reified T : Any> type() = typeOf<T>()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多