android - 从 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
那里一样。
解决方案
我现在正在使用TypeToken
类似于Gson的自定义方法来实现我的目标
abstract class TypeToken<T>
inline fun <reified T : Any> type() = object : TypeToken<T>() {}::class
.java
.genericSuperclass
.let { it as ParameterizedType }
.actualTypeArguments
.first()
但我仍然希望找到一种直接获取ParameterizedType
from的方法T
。
推荐阅读
- regex - Generating regex to exclude a string in path
- android - Android 本机 java8 支持 API 16 4.1.2
- c - GetTempPathA 返回不正确的用户文件夹
- javascript - 在这段代码中将分号放在布尔表达式之前的含义是什么?
- dask - 明智地使用已经完成的计算
- oracle - Oracle 资源管理器 CPU 使用计划
- android - 当我的应用程序在 android 中被杀死并关闭时,为什么我的通知在后台不起作用
- php - 警告:mysqli_query() 期望参数 1 为 mysqli,是否为 null?
- sharepoint - 在 SharePoint 文档库中查看文件属性而不是文件
- polymer - 在 Visual Studio 2015 中运行聚合物