通用类型没有 JsonAdapter(在通用函数内)
No JsonAdapter for Generic Type (inside generic function)
我在将 JSON 解析为通用函数中的数据 class 时遇到错误 No JsonAdapter for R
,我研究并尝试了很多方法,但仍然无法正常工作。
问题是 generic function
不知道泛型参数的类型 R
所以我无法在解析时手动分配 R 的类型。
如何解决这个问题? :(
fun <T, R> sendRequest(msg: Deribit.Request.Message<T>): Deribit.Response.Result<R> {
...
val type = object : TypeToken<Deribit.Response.Result<R>>() {}.type
return moshi.adapter<Deribit.Response.Result<R>>(
type
).fromJson(jsonElement.toString())
...
}
我也使用 reified
return ParameterizedTypeReference
的功能,但它仍然无法正常工作
private inline fun <reified T: Any> typeRef(): ParameterizedTypeReference<T> = object: ParameterizedTypeReference<T>(){}
...
// USAGE
val data = moshi.adapter<Deribit.Response.Result<R>>(
typeRef<Deribit.Response.Result<R>>().type
).fromJson(jsonElement.toString())
谢谢你,并致以最诚挚的问候!
成功
inline fun <reified T, reified R> sendRequest...
应该可以。或者,传递您需要的类型或足以将其构造为参数的类型。例如
fun <T, R> sendRequest(msg: Deribit.Request.Message<T>, clazzR: Class<R>): Deribit.Response.Result<R> {
// Type object for Result<R>
val type = Types.newParameterizedType(Deribit.Response.Result::class.java, clazzR)
...
}
我在将 JSON 解析为通用函数中的数据 class 时遇到错误 No JsonAdapter for R
,我研究并尝试了很多方法,但仍然无法正常工作。
问题是 generic function
不知道泛型参数的类型 R
所以我无法在解析时手动分配 R 的类型。
如何解决这个问题? :(
fun <T, R> sendRequest(msg: Deribit.Request.Message<T>): Deribit.Response.Result<R> {
...
val type = object : TypeToken<Deribit.Response.Result<R>>() {}.type
return moshi.adapter<Deribit.Response.Result<R>>(
type
).fromJson(jsonElement.toString())
...
}
我也使用 reified
return ParameterizedTypeReference
的功能,但它仍然无法正常工作
private inline fun <reified T: Any> typeRef(): ParameterizedTypeReference<T> = object: ParameterizedTypeReference<T>(){}
...
// USAGE
val data = moshi.adapter<Deribit.Response.Result<R>>(
typeRef<Deribit.Response.Result<R>>().type
).fromJson(jsonElement.toString())
谢谢你,并致以最诚挚的问候!
成功
inline fun <reified T, reified R> sendRequest...
应该可以。或者,传递您需要的类型或足以将其构造为参数的类型。例如
fun <T, R> sendRequest(msg: Deribit.Request.Message<T>, clazzR: Class<R>): Deribit.Response.Result<R> {
// Type object for Result<R>
val type = Types.newParameterizedType(Deribit.Response.Result::class.java, clazzR)
...
}