从 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.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<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 具体化类型 TKType 提供实验性 typeOf<T>() 函数。所以所需的代码很简单:

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