The given assertion will fail due to the error
Failed to find the generated JsonAdapter constructor for class GenericType
How do I get the proper type from the reified type T
for Moshi
?
The GenericType
type is annotated with @JsonClass(generateAdapter = true)
using the Kotlin codegen for Moshi using only Moshi.Builder().build()
.
I could generate ParameterizedType
manually with
Types.newParameterizedType(GenericType::class.java, String::class.java)
where GenericType::class.java
is given with T:class.java
. But I don’t know how to get the String
type parameter to generify the approach.
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)
Note that the adapter is available for any GenericType<T>
, just not for the actual class GenericType::class.java
without generic information.
So the following genericType
would find an adapter as long as I know about G
:
inline fun <reified G : Any> genericType() =
newParameterizedType(GenericType::class.java, G::class.java)
This G
is what I'm looking to find in type()
, as T::class.java
is just GenericType::class.java
there.
Kotlin now provides an experimental typeOf<T>()
function to return the KType
of the reified type T
. So the required code is as simple as:
inline fun <reified T : Any> type() = typeOf<T>()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With